在QT视图中显示位图数据

时间:2019-05-21 13:00:38

标签: c++ qt

我正在从头开始编写图像库,我编写了一个控制台应用程序,该程序加载了位图图像,并进行了一些操作并将输出写入另一个位图。 现在,我想在我的应用程序之上构建一个UI。因此,我想在Qt Creator中进行此操作,因为我对Qt有一定的经验,并且希望它可以在多个平台上使用。

这是我的加载位图的代码:

FILE *streamIn = fopen("path/to/file.bmp", "rb");

if (streamIn == (FILE *)0)
{
  printf("Unable to open file\n");
}

unsigned char bmpHeader[54];
unsigned char bmpColorTable[1024];

for (int i = 0; i < 54; i++)
{
  bmpHeader[i] = getc(streamIn);
}

int width = *(int *)&bmpHeader[18];
int height = *(int *)&bmpHeader[22];
int bitDepth = *(int *)&bmpHeader[28];

if (bitDepth <= 8)
{
  fread(bmpColorTable, sizeof(unsigned char), 1024, streamIn);
}
unsigned char buf[height * width];
fread(buf, sizeof(unsigned char), (height * width), streamIn);
fclose(streamIn);

如何将其添加到我的UI中? 我已经尝试过类似的东西:

const QImage image(buf, width, height, QImage::Format_Grayscale8);
imageLabel->setPixmap(QPixmap::fromImage(image));

但这会导致一个很小的白色图像,而不是我刚刚阅读的图像。也许我可以跳过创建QImage并立即创建QPixmap的过程?我现在尝试的方法不起作用,因此也许更有经验的人可以告诉我如何完成它。当我加载初始图像时,我想在进行一些操作时更新视图,以便用户可以看到更改。

我知道使用QImageReader可以轻松得多,但这只是出于学习目的。

1 个答案:

答案 0 :(得分:0)

我不知道我做错了什么,但是现在它可以正常工作了。但是在QImage中读取这样的位图格式存在一个问题,请参见Why are bmps stored upside down?

所以我现在要做的是:

QImage img(width, height, QImage::Format_Grayscale8);
    for(int row = 0; row < img.height(); row++){
        for(int col = 0; col < img.width(); col++) {
            int color = (int)_imgInBuffer[row * img.width() + col];
            img.setPixel(col, height - row - 1, qRgb(color, color, color));
        }
    }

我不知道为什么需要为灰度图像设置红色,绿色,蓝色值,但这是完成它的唯一方法。