【问题标题】:Whats the correct way to use a color lookup table with a Win32 DIB?将颜色查找表与 Win32 DIB 一起使用的正确方法是什么?
【发布时间】:2011-06-06 14:19:12
【问题描述】:

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

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

是我正在尝试做的事情(在绘画时应用我的查找表,而不是修改像素数据本身),甚至 GDI 也支持,或者实际上应该循环遍历像素数据本身,一一更改像素值传送之前?

我是否使用 BitBlt 或 SetDIBitsToDevice 函数似乎也没有什么不同。它们在这里的行为往往相同。

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

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

【问题讨论】:

    标签: directx gdi lookup-tables dib


    【解决方案1】:

    颜色表仅用于具有 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 之类的东西作为从一组颜色转换为另一组颜色的快速查找表。

    【讨论】:

    • 感谢 Leo。我编写了一些代码来枚举像素缓冲区并使用查找表填充新缓冲区以在此过程中执行颜色转换。在我看来,这将是 GDI 通过在输出设备上下文中配置调色板或类似的东西来支持的那种操作,因此问题。
    猜你喜欢
    • 2018-04-10
    • 2013-01-02
    • 1970-01-01
    • 2020-08-27
    • 2020-07-10
    • 2020-09-29
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多