0

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

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

我正在尝试做的事情(在绘画时应用我的查找表,而不是修改像素数据本身)甚至在 GDI 中得到支持,还是实际上应该循环遍历像素数据本身,然后在 blitting 之前一一改变像素值?

我是否使用 BitBlt 或 SetDIBitsToDevice 函数似乎也没有什么不同。他们都倾向于在这里表现相同。

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

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

4

1 回答 1

0

颜色表仅用于具有 8-bpp 或以下的位图,因此 GDI 将在您的 16-bpp 图像中忽略它们。

(该表最多可以有 256 种颜色,按字节索引。)

(从技术上讲,该表仍可用于指定最重要的颜色,但这对您没有帮助,而且我不确定这些天是否真的被任何东西使用。)

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

(请参阅我的问题here,尽管它与您正在做的事情不同,但它应该让您不再依赖 GDI。这是关于从 16-bpp 或 32-bpp 转换为索引颜色,以及 GDI 的问题准确地说:GDI 无法使用精确的调色板转换为索引颜色? ——此外,其中链接的代码设置了一些索引颜色位图,因此您可能会发现它很有用,但我认为它们不适用于您的无论如何都要处理 16-bpp 数据。)

对于您正在做的事情,我建议您自己直接修改位图数据,使用 std::map 之类的东西作为快速查找表,将一组颜色转换为另一组颜色。

于 2011-01-10T16:09:40.867 回答