我尝试将图像(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 to Bitmap。
谢谢:)
答案 0 :(得分:1)
PixelFormat.Format16bppGrayscale是一种白象图像格式。商品硬件,即您在机器中找到的那种,甚至远程接近能够准确呈现这样的位图。这是基于RGB的,每个颜色通道有8位,产生1600万种不同的颜色。其中只有256个是灰色阴影。更糟糕的是商品LCD显示器,它们通常不能比6位颜色信息更好,实际上渲染不超过64种灰度。将65,536个灰色阴影映射到256或64当然会导致 lot 的细节丢失。
它确实用于非常专业的应用程序。一种是放射成像,例如显示X射线图像。但他们也有非常昂贵的显示器来显示这样的图像。非平凡的电子元件是D / A转换器,一个16位转换器,可以在~250 MHz的频率下运行,需要大量的资金。它们还使用专门的图像文件格式,DICOM很常见,GDI +附带的编解码器不支持这些格式。
这里有一个很大的问题,在美国总是一个问题,当你在商品硬件上显示这样的医学图像时,那么无论谁看到它都不能看到足够的细节来正确诊断,比方说,一个不断演变的肿瘤。本身足以阻止微软支持像素格式的像素格式转换,他们不想参与这样的诉讼。
GDI +支持存储这样的图像。您可以使用Bitmap.LockBits()获取像素数据。适合图像处理应用。但是,为此类图像创建Graphics对象或在此类图像上使用Graphics.DrawImage()的任何尝试都将导致异常。这是Bitmap(Image)构造函数的作用。寻找像LeadTools这样的供应商以获得图书馆支持。