gpt4 book ai didi

c++ - 图像从 24 bpp 格式转换为 16 bpp 格式

转载 作者:可可西里 更新时间:2023-11-01 11:09:21 26 4
gpt4 key购买 nike

我有一张图像,即使用 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 个像素来解决此问题。此外,编译器应该足够聪明以优化对同一指针的多次访问,但让我们假设它没有并将它们复制到临时变量。我还假设您希望在示例代码中保留每个颜色 channel 的高位而不是低位。

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;
}

关于c++ - 图像从 24 bpp 格式转换为 16 bpp 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7983706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com