我正在使用 SimpleITK 读取 DICOM,并将特定切片保存为 PNG 文件。我可以将一个新的 DICOM 文件写回磁盘,它看起来和预期的一样。但是每当我尝试以任何其他格式保存它时,它都会被严重损坏。我的意思是它看起来不像输入,它完全是乱码。
这是代码:
var imageReader = new ImageFileReader();
imageReader.SetOutputPixelType(PixelIDValueEnum.sitkUInt8);
var dicomFileNames = ImageSeriesReader.GetGDCMSeriesFileNames(@"D:\Study");
imageReader.SetFileName(dicomFileNames[255]);
var image = imageReader.Execute();
var fileWriter = new ImageFileWriter();
fileWriter.SetFileName("slice.png");
fileWriter.Execute(image);
获取图像的缓冲区并使用它来创建 BitMap 会遇到同样的问题。读取 DICOM 系列(我的最终目标)而不是一个文件,并使用 3D 体积并以这种方式提取切片也有同样的问题。
我错过了什么?
编辑:虽然对比度关闭并且丢失了一些细节,但使用PixelIDValueEnum.sitkUInt16
大大提高了 的输出。ImageFileWriter
我仍然无法将缓冲区转换为位图并将其另存为 PNG,此代码仍会创建损坏的数据:
var size = image.GetSize();
var length = (int)(size[0] * size[1]) * 2;
var buffer = image.GetBufferAsUInt16();
var rgbValues = new byte[length];
Marshal.Copy(buffer, rgbValues, 0, length);
var newBitmap = new Bitmap((int)image.GetWidth(), (int)image.GetHeight(), (int)image.GetWidth(), PixelFormat.Format16bppArgb1555, buffer);
newBitmap.Save(@"C:\test.png", ImageFormat.Png);
我尝试了每个PixelFormat.16bpp*
值都没有成功,一些数据肯定丢失了,因为 ImageFileWriter 的输出比我保存位图时大 50% 以上。
这是坏位图: