Convert Image 16 bits grayscale to Bitmap 16 bit grayscale (构造函数错误)

Convert Image 16bits grayscale to Bitmap 16bits grayscale (Constructor error)

我尝试将图像(16 位灰度)转换为位图(16 位灰度)。

此示例无效(异常:ArgumentException)

    private Mat ToMat16bGrayscale(Image im)
    {

        Bitmap bmp2 = new Bitmap(im); 

    }

但是这个例子有效:

 private Mat ToMat16bGrayscale(Image im)
 {

   //Cast obligatoire la création ou la copie d'une bitmap ne   fonctionne pas ici... 
                Bitmap bmp = (Bitmap)(im);
                Bitmap new_bmp = (Bitmap)bmp.Clone(); 
 }

我想知道为什么构造函数 Bitmap 不适用于图像 16 位灰度以及为什么将图像转换为位图有效。

谢谢 :)

PixelFormat.Format16bppGrayscale 是一种白象图像格式。商品硬件,即您在机器中找到的那种,甚至 远程 都无法准确地呈现这样的位图。这是基于 RGB 的,每个颜色通道有 8 位,可产生 1600 万种不同的颜色。其中只有 256 个是灰色阴影。更糟糕的是商品 LCD 显示器,它们通常无法使 6 位颜色信息与众不同,实际上渲染不超过 64 级灰度。将 65,536 级灰度级映射到 256 级或 64 级当然会导致 很多 细节丢失。

它确实用于非常专业的应用程序。一种是放射成像,例如显示 X 射线图像。但他们也有非常昂贵的显示器来显示这样的图像。重要的电子元件是 D/A 转换器,一个可以 运行 在 ~250 MHz 的 16 位转换器花费很多很多钱。它们还使用专门的图像文件格式,DICOM 很常见,GDI+ 中包含的编解码器不支持这些格式。

这里有很大的责任,在美国总是一个问题,当你在商品硬件上显示这样的医学图像时,无论谁看它都无法看到足够的细节来正确诊断,比如说,不断发展的肿瘤。像素格式本身就足以劝阻微软支持像素格式转换,他们不想卷入这样的官司。

GDI+ 支持存储这样的图像。您可以使用 Bitmap.LockBits() 获取像素数据。足够适合图像处理应用。但是任何为此类图像创建 Graphics 对象或在此类图像上使用 Graphics.DrawImage() 的尝试都会导致异常。这就是 Bitmap(Image) 构造函数的作用。寻找像 LeadTools 这样的供应商来提供库支持。