我有一个图像即绘制使用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; }
代码工作正常,但性能不是很好,因为我是逐像素修改。 你能提出任何可能的改善这个转换?
提前致谢
你的代码不完整; 你不显示指针的类型或者你如何增加它们。 每像素执行的操作数量看起来非常优化,所以我会猜测任何缓慢都来自未对齐的内存访问。 你可以通过展开循环和一次做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; }