我有一个图像,即使用Windows GDI调用(24bpp)绘制的,我需要将此图像转换为16bpp。这是在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;
}代码运行良好,但性能不是很好,因为我是一个像素一个像素地修改。您能对此转换提出任何可能的改进建议吗?
提前感谢
发布于 2011-11-03 01:41:17
您的代码不完整;您没有显示指针的类型或如何递增它们。您在每个像素上执行的操作数量看起来非常理想,所以我将猜测任何缓慢的操作都来自于未对齐的内存访问。您可以通过展开循环并一次处理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;
}https://stackoverflow.com/questions/7983706
复制相似问题