什么是使用Win32 DIB的颜色查找表的正确方法?

时间:2011-01-10 15:02:31

标签: directx gdi lookup-tables dib

我正在编写一些代码来对16位DICOM图像(在内存中加载为16位DIB)执行窗口调平。我的窗口调平代码已完成,可通过生成查找表来将源像素值映射到所需的最终像素值。

我不确定如何将此查找表应用于图像。我看到BITMAPINFO对象上有一个字段'bmiColors',类型为RGBQUAD []。我已经尝试将查找表分配给此属性,但它似乎没有任何效果。我也尝试过SetDIBColorTable函数,但它似乎也没有对屏幕输出产生任何影响。

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

使用BitBlt或SetDIBitsToDevice函数似乎也没有区别。他们在这里的行为往往相同。

如果能够更容易地实现我想要的东西,我愿意使用DirectX。我之前没有使用它,所以如果它作为答案提供,示例代码会很好。

我的代码非常重要,所以我正在寻找实现这一目标的最快方法,即使它可能涉及更多的工作/代码。

1 个答案:

答案 0 :(得分:0)

颜色表仅用于8-bpp或更低的位图,因此GDI会在16-bpp图像中忽略它们。

(该表最多可包含256种颜色,以字节为索引。)

(从技术上讲,该表可能仍然用于指定哪些颜色最重要,但对您没有帮助,而且我不确定这些日子是否真的使用了这些颜色。)

我还发现GDI在索引颜色模式下工作不可靠,所以我不推荐它。

(在这里看到我的问题,虽然它与你正在做的事情不一样,但是你应该依靠GDI来解决这个问题。它是关于从16-bpp或32-bpp转换为索引颜色,以及GDI的问题准确地做到了这一点:GDI fails conversion to indexed color with exact palette? - 此外,在那里链接的代码设置了一些索引颜色的位图,所以你可能会发现它很有用,但我不认为它们会适用于你所做的事情。无论如何,16-bpp数据。)

对于你正在做的事情,我建议你自己直接修改位图数据,使用像std :: map这样的快速查找表,用于从一组颜色转换到另一组颜色。