2011-01-10 41 views
0

我正在写一些代码来执行16位DICOM图像(作为16位DIB在内存中加载)进行窗口调整。我的窗口调平代码是完整的,并通过生成查找表将源像素值映射到所需的最终像素值。在Win32 DIB中使用颜色查找表的正确方法是什么?

什么我不知道的是如何将这种查找表应用到图像。我看到BITMAPINFO对象在其'bmiColors'上有一个类型为RGBQUAD []的字段。我试着将查找表分配给这个属性,但它似乎没有效果。我也尝试了SetDIBColorTable函数,但它对屏幕输出似乎也没有任何影响。

是我正在尝试做的(在绘制时应用我的查找表而不是修改像素数据本身)甚至在GDI中支持,或者实际上应该是通过像素数据本身循环更改像素值blitting之前的一个?

它也似乎不有所作为我是否使用的BitBlt或功能的SetDIBitsToDevice。他们在这里倾向于表现一致。

我愿意使用DirectX的,如果这样做更容易才达到我想要的东西。我之前没有使用过它,所以如果以答案的形式提供示例代码将会很好。

我的代码是非常关键的性能,所以我在寻找实现这一目标的最快捷的方法,即使它可能涉及更多的努力/代码。

回答

0

色表只用于具有8位色或以下的位图,因此GDI会在你的16位色的图像忽略它们。

(表最多只能有256种颜色,由字节索引。)

(从技术上讲,该表仍可以用来指定颜色是最重要的,但它不能帮助你,而且我不敢肯定这真的使用任何这些天。)

我还发现GDI是不可靠的在索引颜色模式工作,所以我不会推荐它。 (这里看我的问题,尽管它跟你所做的不一样,但应该让你依靠GDI来做这件事,它是关于从16-bpp或32-bpp转换成索引颜色,以及问题GDI准确地做到了这一点:GDI fails conversion to indexed color with exact palette? - 此外,在那里链接的代码设置了一些索引颜色的位图,因此您可能会发现它很有用,但我认为它们不适用于您正在处理的16位bpp数据无论如何。)

对于你在做什么,我建议你自己直接修改位图数据,使用像std :: map作为一个快速查找表从一组颜色转换到另一个。

+0

感谢那个狮子座。我已经编写了一些代码来枚举像素缓冲区,并使用查找表填充新缓冲区,以在此过程中执行颜色转换。在我看来,这似乎是GDI通过在输出设备上下文中配置调色板或类似的东西来支持的操作,因此是一个问题。 – Josh 2011-01-11 14:38:20

相关问题