首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从24bpp到16bpp格式的图像转换

从24bpp到16bpp格式的图像转换
EN

Stack Overflow用户
提问于 2011-11-03 00:19:17
回答 1查看 2.5K关注 0票数 1

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

代码语言:javascript
复制
 24 bpp - RGB (rrrrrrrr gggggggg bbbbbbbb)
 16 bpp - RGB (rrrrr gggggg bbbbb)

为此,我使用以下代码

代码语言:javascript
复制
for (int x = 0; x < iScreenSize; x++)
{
    *iPixel1= (*iPixel & 0x0000001F) |
              (*iPixel & 0x00003F00) >> 3 | 
              (*iPixel & 0x001F0000) >> 5;
}

代码运行良好,但性能不是很好,因为我是一个像素一个像素地修改。您能对此转换提出任何可能的改进建议吗?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-03 01:41:17

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

代码语言:javascript
复制
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;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7983706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档