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 を作成すると、同じ問題が発生します。1 つのファイルの代わりに DICOM シリーズ (私の最終的な目標) を読み取り、3D ボリュームを使用してその方法でスライスを抽出することにも同じ問題があります。
私は何が欠けていますか?
編集: を使用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% 以上大きいため、一部のデータが失われているはずです。
悪いビットマップは次のとおりです。