我有一个图像,即使用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;
}
代码工作正常但性能不是那么好,因为我逐个像素地修改。 你能否建议对这种转换进行任何改进?
提前致谢
答案 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;
}