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

 

A Generic error occurred in GDI+ in Bitmap.Save method

I am working on to upload and save a thumbnail copy of that image in a thumbnail folder. I am using following link: http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-upl...

stackoverflow.com

 

결론부터 말하면 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);
	}
}

 

정상적으로 코드가 수행되는 것을 확인할 수 있습니다.

 

 

 

 

 

 

반응형

+ Recent posts