1

我有一个包含原始图像数据的文件。每个像素都表示为16 bit (0-65536)值。

我正在将所需的数据部分读入一个ushort[]数组。在做了一些图像处理之后,我需要以某种方式向用户展示这个图像。我绘制 8 位灰度没有问题(我只是将每个像素的 R、G 和 B 值设置为相同),但无法处理 16 位/像素灰度图像。

另一种可能性是使用PixelFormat.Format48bppRgb并将 r,g 和 b 设置为相同的 16 位 grascale,但我找不到如何。

我发现了一些使用unsafecode 和的代码片段LockBits,但无法让它们工作。

有什么方法可以绘制 16 位灰度图像而不将其缩小到 8 位?

请给我一个代码片段。

编辑:这就是我设置 8 位灰度的方式:

Array img;
//var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
if (bitsPerElement == 8)
{
    //img = Array.CreateInstance(typeof(byte), bitmapHeigth*bitmapWidth);
    img = GetLayerBytes<byte>(LayerNum) as byte[];
}
else
{
    img = GetLayerBytes<UInt16>(LayerNum) as UInt16[];
}

int ind = 0;
for (int heigth = 0; heigth < bitmapHeigth; heigth++)
{
    for (int width = 0; width < bitmapWidth; width++)
    {
        int current = Convert.ToInt32(img.GetValue(ind));
        ind++;

        bmp.SetPixel(width, heigth, Color.FromArgb(current, current, current));
    }
}
pictureBox1.Image = bmp;
4

1 回答 1

0

如果有人正在寻找答案,请引用Hans Passant的话:

这些像素格式是在 GDI+ 中定义的,期望有一天它可能会随着显示技术的充分进步而有用。我们仍在等待。实际上,LCD 面板无法显示 24rgb 格式的所有可能的 1600 万种颜色。实际上,查看 16 位格式的灰度级需要专门的硬件和训练有素的眼睛,您可以在医院找到这种眼睛。具有匹配的非标准图像格式,如 DICOM。您可以从像 Lead Tools 这样的供应商处购买。

于 2014-03-11T08:37:05.420 回答