如果我使用 Qt 执行以下操作:
- 在 QImage::Format_RGB32 中加载位图。
- 将其像素转换为 RGB565(没有 Qt 格式,所以我必须“手动”完成)。
- 创建一个与步骤 1 中加载的大小相同的新位图。
- 将 RGB565 缓冲区像素转换回 RGB88 到步骤 3 中创建的图像。
- 从第 4 步创建的图像看起来像第 1 步中的图像,但是如果您比较 RGB 值,它们并不完全相同。
重复步骤 2 到 5 会导致最终图像失去颜色 - 它似乎变得越来越暗。
这是我的转换函数:
qRgb RGB565ToRGB888( unsigned short int aTextel )
{
unsigned char r = (((aTextel)&0x01F) <<3);
unsigned char g = (((aTextel)&0x03E0) >>2);
unsigned char b = (((aTextel)&0x7C00 )>>7);
return qRgb( r, g, b, 255 );
}
unsigned short int RGB888ToRGB565( QRgb aPixel )
{
int red = ( aPixel >> 16) & 0xFF;
int green = ( aPixel >> 8 ) & 0xFF;
int blue = aPixel & 0xFF;
unsigned short B = (blue >> 3) & 0x001F;
unsigned short G = ((green >> 2) < 5) & 0x07E0;
unsigned short R = ((red >> 3) < 11) & 0xF800;
return (unsigned short int) (R | G | B);
}
我从我的测试图像中发现的一个不能正确转换的例子是 4278192128,它从 RGB565 转换回 RGB888 为 4278190080。
编辑:我还应该提到原始源数据是 RGB565(我的测试 RGB888 图像是从中创建的)。我只是为了显示目的而转换为 RGB888,但之后想转换回 RGB565,而不是保留数据的两个副本。