我正在使用带有 C# 的 mDCM 来查看 dicom 标签,但我正在尝试将像素数据转换为位图并最终转换为 JPG 文件。我已阅读 mDCM Google Group 上有关该主题的所有帖子,并且所有代码示例都不起作用或缺少重要的代码行。我正在使用的图像是 16 位单色 1(即提到的格式,但它实际上是 16 位灰度)。我曾尝试使用 LockBits、SetPixel 和不安全代码将像素数据转换为位图,但所有尝试都失败了。有没有人有任何代码可以使这项工作。
这是我使用 SetPixel 的最新尝试:
DcmElement pixelData = this.currentFileFormat.Dataset.GetElement(new DcmTag(DcmConstTags.PixelData));
ushort[] pixels = this.currentPixelData.GetFrameDataU16(0);
this.currentImage = new Bitmap(this.currentPixelData.ImageWidth, this.currentPixelData.ImageHeight, PixelFormat.Format16bppRgb555);
int resample = (int)Math.Pow(2, (this.currentPixelData.BitsStored - 8));
int pxCounter = 0;
int min = ushort.MaxValue;
int max = 0;
for (int c = 0; c < this.currentPixelData.ImageHeight; c++)
{
for (int r = 0; r < this.currentPixelData.ImageWidth; r++)
{
ushort pxColor = pixels[pxCounter];
int temp = 255 - (pxColor / resample);
if (temp < min) min = temp;
if (temp > max) max = temp;
this.currentImage.SetPixel(r, c, Color.FromArgb(temp, temp, temp));
pxCounter++;
}
}
更新:通过使用 LockBits 和 Marshal.Copy,我已经更接近了,但是图像以彩虹色而不是灰度出现。所以我猜我需要一种将灰度数据转换为 RBG 格式的方法:
byte[] pixels = this.currentPixelData.GetFrameDataU8(frameIndex);
this.currentImage = new Bitmap(this.currentPixelData.ImageWidth, this.currentPixelData.ImageHeight, PixelFormat.Format16bppRgb555);
BitmapData bitmapData = this.currentImage.LockBits(new Rectangle(0, 0, this.currentImage.Width, this.currentImage.Height), ImageLockMode.ReadWrite, this.currentImage.PixelFormat);
System.Runtime.InteropServices.Marshal.Copy(pixels, 0, bitmapData.Scan0, this.currentImage.Width * this.currentImage.Height * 2);
this.currentImage.UnlockBits(bitmapData);
提前致谢
PS 在有人建议尝试像 ClearCanvas 这样的其他东西之前,要知道 mDCM 是唯一适合我需要的库,而 ClearCanvas 对于我需要做的事情来说太臃肿了。