首页 > 解决方案 > 从 BITMAPINFO 和 uchar* 数据创建 QImage

问题描述

我正在尝试加载作为 aBITMAPINFO*uchar数组提供给我的图像。文档声明它是标准的 Microsoft 设备无关位图 (DIB),具有 8 位像素和 256 项颜色表

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

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

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

但我有两个问题:

  1. QImage::Format_Grayscale8当文档声明一个 8 位像素和一个 256 项颜色表时,图像就在其中;

  2. 图像颠倒并镜像。这来自位图数据在 Win32 中的存储方式。

任何人都知道如何正确加载此图像?

标签: c++qtwinapiqimagebitmapdata

解决方案


通过将提供的标题转换为 aBITMAPINFO而不是 aBITMAPINFOHEADER我可以访问颜色表,然后应用转换来获得一个立体图像:

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

推荐阅读