0

我正在使用 gdcm (nuget gdcm-sharp 2.4.4) 库从 *.dcm 文件中获取图像和患者数据。在具有光度解释 MONOCHROME2 的文件上一切都很好,但后来我得到了一些带有 MONOCHROME1 的文件,其中大约 30% 的文件有一个奇怪的错误:图像对角“切片”,我找不到原因。样本链接:不正确的图像正确的图像

每行像素都有行号的偏移量......很容易纠正,但我不知道哪个文件需要纠正。

问题是:如何判断需要更正的文件,dcm 标签相同,.dcm 文件中唯一不同的是图像尺寸和像素数据...

还有一件事……我试图查看这些图像的任何其他软件都可以正确渲染它们。

一些代码来显示做了什么

// pixel data copied to WriteableBitmap then saved by JpegBitmapEncoder 
var reader = new gdcm.ImageReader();
var gimg = reader.GetImage();
WriteableBitmap wb = new WriteableBitmap((int)cols, (int)rows, 120, 120, PixelFormats.Gray16, null);
wb.Lock();
Marshal.Copy(buff, 0, wb.BackBuffer, buff.Length);
wb.Unlock();

using (var ms2 = new MemoryStream())
{
    JpegBitmapEncoder enc = new JpegBitmapEncoder();
    enc.QualityLevel = 95;
    enc.Frames.Add(BitmapFrame.Create(wb));
    enc.Save(ms2);
    jpegfile = ms2.GetBuffer();
}
4

1 回答 1

1

看看您提供的好与坏图像:好的是 1290 x 1249,坏的是 1195 x 1193

自从我使用 Windows 位图以来已经有一段时间了,但我几乎可以肯定它们是逐行填充的(不确定是 2 字节、4 字节(最有可能)还是任何对齐方式),但是鉴于你的例子,这个99% 确定发生了什么。

而不是做整个缓冲区的单个 Marshal.Copy ,您需要逐行执行(只是我的伪代码):

Foreach row:
   Marshal.Copy(buff + row_number * DicomImageRowLength, 0, wb.BackBuffer + row_number * wb.BackBufferStride, DicomImageRowLength);

如果 Marshal.Copy 需要将 buff 作为第一个参数:

Foreach row:
   Marshal.Copy(buff, row_number * DicomImageRowLength, wb.BackBuffer + row_number * wb.BackBufferStride, DicomImageRowLength);

如果您为每种情况逐行复制,希望这适用于所有图像......

我认为您可以通过查看 wb.BackBuffer.Size 并将其与两种情况下的 wb.PixelWidth、wb.PixelHeight 和 wb.BackBufferStride 进行比较来验证这是否正在发生。

于 2015-08-10T16:29:12.897 回答