将图像16位灰度转换为位图16位灰度(构造函数错误)



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

这个例子不工作(Exception: 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位灰度一起工作,以及为什么将图像转换为Bitmap工作。

谢谢

PixelFormat。灰度是一种累赘的图像格式。商品硬件,你会在你的机器中找到的那种,甚至不能接近能够准确地渲染这样一个位图。它是基于rgb的,每个颜色通道有8位,产生1600万种不同的颜色。其中只有256个是灰色的。更糟糕的是商品液晶显示器,它们通常只能区分6位色彩信息,实际上只能显示64个灰色阴影。将65,536个灰度映射到256或64当然会导致批次的细节丢失。

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

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

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

最新更新