Я использую 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 (моя конечная цель) вместо одного файла и использование трехмерного тома и извлечение фрагмента таким образом также имеет ту же проблему.
Что мне не хватает?
РЕДАКТИРОВАТЬ: Использование PixelIDValueEnum.sitkUInt16
значительно улучшает вывод ImageFileWriter
, хотя контрастность отключена и теряет некоторые детали. Я все еще не могу преобразовать буфер в BitMap и сохранить его как 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% больше, чем при сохранении растрового изображения.
Вот плохой BitMap: