从 BITMAPINFO 和 uchar* 数据创建 QImage

问题描述

我正在尝试加载作为 BITMAPINFO*uchar 数组提供给我的图像。 该文档指出它是一个标准的 Microsoft 设备无关位图 (DIB),具有 8 位像素和 256 个条目的颜色表

我目前可以通过以下方式打开此图像:

BITMAPINFO* bmih = givenBITMAPINFO;
uchar* data = givendata;

QImage img = QImage(data,bmih->biWidth,bmih->biHeight,QImage::Format_Grayscale8);

但是我有两个问题:

  1. 当文档说明 8 位像素和 256 个条目的颜色表时,图像位于 QImage::Format_Grayscale8 中;

  2. 图像是倒置和镜像的。这来自于位图数据在 Win32 中的存储方式。

有人知道如何正确加载这张图片吗?

解决方法

通过将提供的标头转换为 BITMAPINFO 而不是 BITMAPINFOHEADER,我可以访问颜色表,然后应用转换以获得直的图像:

BITMAPINFO* bmi = givenHeader;
uchar* data = givenData;

QImage img = QImage(data,bmi->bmiHeader.biWidth,bmi->bmiHeader.biHeight,QImage::Format_Indexed8);

img.setColorCount(256);
for (int i=0; i<256; ++i){
    RGBQUAD* rgbBmi = bmi->bmiColors;
    img.setColor(i,qRgb(rgbBmi[i].rgbRed,rgbBmi[i].rgbGreen,rgbBmi[i].rgbBlue))
}

img = img.mirrored(false,true);