比较 16 bpp 和 32 bpp 位图转换 未使用的位Alpha 通道

问题描述

我得到了一个 16 bpp 位图

bitmap

,我通过以下代码将其转换为 32 bpp:

void Rgb555ToRgb8(const UChar* bitmapData,UInt32 width,UInt32 height,UChar* buf)
{

    UInt32 dst_bytes_per_row = width * 4;
    UInt32 src_bytes_per_row = ((width * 16 + 31) / 32) * 4;

    UInt16 red_mask = 0x7C00;
    UInt16 green_mask = 0x3E0;
    UInt16 blue_mask = 0x1F;

    for (UInt32 row = 0; row < height; ++row)
    {
        UInt32 dstCol = 0,srcCol = 0;

        do
        {
            UInt16 rgb = *(UInt16*)(bitmapData + row * src_bytes_per_row + srcCol);

            UChar red_value = (rgb & red_mask) >> 10;
            UChar green_value = (rgb & green_mask) >> 5;
            UChar blue_value = (rgb & blue_mask);

            buf[row*dst_bytes_per_row + dstCol] = blue_value << 3;
            buf[row*dst_bytes_per_row + dstCol + 1] = green_value << 3;
            buf[row*dst_bytes_per_row + dstCol + 2] = red_value << 3;
            buf[row*dst_bytes_per_row + dstCol + 3] = rgb >> 15;

            srcCol += 2;
            dstCol += 4;

        } while (srcCol < src_bytes_per_row);
    }
}

这是转换结果:[2]:https://i.stack.imgur.com/1ajO7.png

我也尝试通过 GdiPlus 转换此图像:

Gdiplus::Bitmap* bmp = new Gdiplus::Bitmap(w,h,PixelFormat32bppRGB);

结果图像为

here

请注意,这 2 个结果看起来并不完全相同(例如,GdiPlus 结果中的背景为白色)。如何修改我的代码以匹配 GdiPlus 结果?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)