1

我尝试将图像(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 不适用于 Image 16bits 灰度以及为什么将 Image 转换为 Bitmap 有效。

谢谢 :)

4

1 回答 1

1

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

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

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

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

于 2015-05-29T12:21:39.743 回答