我的相机为我提供了14位灰度图像,但API的功能会向图像数据返回一个长*。 (所以我假设每个像素有4个字节)
我的应用程序是用C ++ / CLI编写的,而pictureBox是.NET类型的
我目前正在使用BitmapData.LockBits()
机制来获取对图像数据的指针访问,并使用
memcpy(bmpData.Scan0.ToPointer(), imageData, sizeof(long)*height*width)
将图像数据复制到位图
目前,唯一正在使用的PixelFormat是32位RGB,图像以蓝色阴影显示轮廓。
尝试将位图初始化为16bppGrayscale不起作用 理想情况下,我希望将数组从长到有字并使用16位格式(希望14位数据正确显示),但我不确定这是否有效。 此外,我不想迭代图像数据,所以找到最小/最大然后直方图拉伸到[0..255]对我来说不是一个选项(显示必须尽可能高效)
由于
答案 0 :(得分:1)
是的,对于高强度像素,这看起来会非常蓝,有些是绿色。你有一个像素格式不匹配,32bppRgb有一个蓝色字节,一个绿色,一个红色和一个未使用的字节。直接复制灰色图像将设置蓝色字节,最多6位绿色。
如果只有GDI +实际支持它,16bppGrayScale会很棒。问题是没有主流视频适配器处理这种格式。您需要将像素值转换为RGB三元组。要使其看起来是灰色的,您需要将蓝色,绿色和红色字节设置为相同的值。这将是一个有损转换,因为你需要将14位压缩成8位。这并不重要,人眼不足以区分16,384个不同的灰度级。只需将像素值右移6,假设相机为高亮度像素生成16383像素值。 24bppRgb或32bppRgb像素格式都可以使用,后者会更快,因为它适合int而你不需要大步前进。请注意,假彩色图像也是可能的。您可以任意将14位灰度值映射到颜色。最快的方法是使用int [16384]映射表。你坚持在桌子上完全取决于你,常见的映射是低强度的深红色,高强度值的紫色。
这对图像显示来说已经足够了。但是,如果您进行任何图像处理,那么您可能希望利用相机的分辨率。你需要远离Bitmap。查看像LeadTools这样的图形库供应商。