图像从24 bpp转换为16 bpp格式

时间:2011-11-02 16:19:17

标签: c++ windows graphics windows-mobile gdi

我有一个图像,即使用Windows GDI调用(24 bpp)绘制,我需要将此图像转换为16 bpp。这是在Windows Mobile上。

 24 bpp - RGB (rrrrrrrr gggggggg bbbbbbbb)
 16 bpp - RGB (rrrrr gggggg bbbbb)

为此,我使用以下代码

for (int x = 0; x < iScreenSize; x++)
{
    *iPixel1= (*iPixel & 0x0000001F) |
              (*iPixel & 0x00003F00) >> 3 | 
              (*iPixel & 0x001F0000) >> 5;
}

代码工作正常但性能不是那么好,因为我逐个像素地修改。 你能否建议对这种转换进行任何改进?

提前致谢

1 个答案:

答案 0 :(得分:6)

您的代码不完整;您不显示指针的类型或如何递增它们。每个像素执行的操作数看起来非常理想,所以我猜测任何缓慢来自未对齐的内存访问。您可以通过展开循环并一次执行4个像素来解决此问题。此外,编译器应该足够智能以优化对同一指针的多次访问,但假设它不会,而是将它们复制到临时变量。我还假设您要保留每个颜色通道的高位而不是示例代码中的低位。

UINT32 * iPixel;
UINT16 * iPixel1;
for (int x = 0; x < iScreenSize; x+=4)
{
    UINT32 dw1 = *iPixel++;
    UINT32 dw2 = *iPixel++;
    UINT32 dw3 = *iPixel++;
    *iPixel1++ = (dw1 & 0x000000F8) >> 3 |
                 (dw1 & 0x0000FC00) >> 5 |
                 (dw1 & 0x00F80000) >> 8;
    *iPixel1++ = (dw1 & 0xF8000000) >> 27 |
                 (dw2 & 0x000000FC) << 3 |
                 (dw2 & 0x0000F800);
    *iPixel1++ = (dw2 & 0x00F80000) >> 19 |
                 (dw2 & 0xFC000000) >> 21 |
                 (dw3 & 0x000000F8) << 8;
    *iPixel1++ = (dw3 & 0x0000F800) >> 11 |
                 (dw3 & 0x00FC0000) >> 13 |
                 (dw3 & 0xF8000000) >> 16;
}