fo-dicom을 사용해 dicom파일에서 이미지를 추출하는 방법에 대해 알아봅니다. 또한 해당 작업을 수행하며 겪은 "A generic error occurred in GDI+." 에러를 해결하는 방법에 대해서도 알아봅니다.
Git에 나온 방법을 그대로 사용할 수 없어서 이것저것 알아보다 사용하게 된 코드입니다.
// Dicom images
ImageManager.SetImplementation(new WinFormsImageManager());
DicomImage dcmImg = new DicomImage(dcmFile.Dataset);
filePath = string.Format("{0}/{1}.bmp", folderPath, fileNameWithoutExt);
System.Drawing.Bitmap dcmBitmap = dcmImg.RenderImage().AsClonedBitmap();
dcmBitmap.Save(folderPath, System.Drawing.Imaging.ImageFormat.Bmp);
해당 코드를 수행하면 Save에서 다음과 같은 오류를 마주하게 됩니다: A generic error occurred in GDI+.
위 오류를 해결하기 위해 fo-dicom 관련 글을 뒤져봤으나 해결 방법을 찾을 수 없었는데 fo-dicom이 아닌 다른 글에서 해결 방법을 찾을 수 있었습니다: A Generic error occurred in GDI+ in Bitmap.Save method
결론부터 말하면 fo-dicom과 관련된 문제가 아닌 Bitmap과 관련된 문제였습니다. MSDN과 연결된 링크는 확인할 수 없었으나 발췌된 글은 다음과 같습니다.
When either a Bitmap object or an Image object is constructed from a file, the file remains locked for the lifetime of the object. As a result, you cannot change an image and save it back to the same file where it originated.
> Bitmap 객체 또는 Image 객체가 파일에서 생성되면 생성된 파일은 객체의 수명 동안 잠긴 상태로 유지됩니다. 따라서 이미지를 변경하거나 원본과 동일한 파일에 다시 저장할 수 없습니다.
따라서 문제 되는 부분은 Bitmap을 Save 하는 부분이었습니다. 이를 해결하기 위해 다음과 같이 코드를 수정해 해결할 수 있었습니다.
// Dicom images
ImageManager.SetImplementation(new WinFormsImageManager());
DicomImage dcmImg = new DicomImage(dcmFile.Dataset);
filePath = string.Format("{0}/{1}.jpg", folderPath, fileNameWithoutExt);
System.Drawing.Bitmap dcmBitmap = dcmImg.RenderImage().AsClonedBitmap();
using (MemoryStream ms = new MemoryStream())
{
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
{
dcmBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytesBitmap = ms.ToArray();
fs.Write(bytesBitmap, 0, bytesBitmap.Length);
}
}
정상적으로 코드가 수행되는 것을 확인할 수 있습니다.
반응형
'Programming > C#' 카테고리의 다른 글
[C# | WPF] .Net 5.0 WPF에서 WinForm의 OpenFileDialog를 사용하기. (0) | 2021.04.09 |
---|---|
[C#] System.Drawing.Bitmap 관련 "The type initializer for 'Gdip' threw an exception." 오류 해결 방법 (0) | 2021.03.25 |
[C#] IsNullOrEmpty와 IsNullOrWhiteSpace의 차이점 (0) | 2021.03.08 |
[EF] Entity Framework와 Repository 패턴을 함께 쓰지 말아야 하는 이유. (0) | 2021.02.19 |
[.Net5.0] 컴퓨터에 Framework 어셈블리가 없습니다. (1) | 2021.01.29 |