2010-05-17 92 views
1

我的相机给了我14bit灰度图像,但API的函数返回一个long *到图像数据。 (所以我假设每个像素4字节)复制一个14bit灰度图像(保存在long []中)到一个pictureBox

我的应用程序是用C++/CLI编写的,而pictureBox是.NET类型的。
我目前使用的BitmapData.LockBits()机制来获得指针访问到的图像数据,并使用
memcpy(bmpData.Scan0.ToPointer(), imageData, sizeof(long)*height*width)
的图像数据复制到该位图。
现在,唯一可用的PixelFormat是32位RGB,并且图像以等高线显示为蓝色阴影。

尝试将位图初始化为16bppGrayscale不起作用。
我想理想地将数组从长转换为单词并使用16位格式(希望14位数据将正确显示),但我不确定这是否可行。 此外,我不想迭代图像数据,所以找到最小/最大值,然后直方图拉伸到[0..255]不是我的选项(显示必须尽可能高效)

谢谢

回答

1

是的,这将看起来非常蓝,一些绿色的高亮度像素的阴影。你有一个像素格式不匹配,32bppRgb有一个字节的蓝色,一个绿色,一个红色和一个未使用的字节。直接复制灰色图像将设置蓝色字节,高达6位绿色。

16bppGrayScale会很好,如果只有GDI +实际上支持它。问题是没有主流视频适配器处理这种格式。您需要将像素值转换为RGB三元组。要使它看起来灰色,您需要将蓝色,绿色和红色字节设置为相同的值。这将是一个有损转换,因为您需要将14位压缩为8位。这并不重要,人眼不足以区分16,384个不同的灰度级。只需将像素值右移6,假定相机为高亮度像素生成像素值16383。无论是24bppRgb还是32bppRgb像素格式都可以工作,后者会更快,因为它适合int类型,而且您不必步幅跳跃。

请注意,假色图像也是可能的。您可以任意将14位灰度值映射为颜色。最快的方法是使用int [16384]映射表。你在桌子上粘的东西完全取决于你,普通的映射对于低强度是深红色的,对于高强度值是紫色的。

这对图像显示已经足够了。但是,如果您进行任何图像处理,则可能需要利用相机的分辨率。你需要远离Bitmap。查看像LeadTools这样的图形库供应商。

+0

我在14位阵列上做IP,我只需要显示摄像机图像,这样我知道系统已经正常工作。 明智的实施 - 从你的建议(两个选项)我仍然需要迭代整个图像..对吧?对于选项A,我将SR加6,然后将此值复制到R&G,对于第二我将不得不在图像上执行映射。 – Itsik 2010-05-17 13:55:17

+0

是的,映射每个单独的像素将是必需的。 – 2010-05-17 14:01:42

+0

也许我只能更改位图中的ColorPalette?关于图书馆,我有IPP,但不知道它的任何功能是否可以帮助我。 – Itsik 2010-05-17 14:11:26

相关问题