【问题标题】:Display bitmap data in QT view在 QT 视图中显示位图数据
【发布时间】:2019-05-21 13:00:38
【问题描述】:

我正在从头开始编写一个图像库我已经编写了一个控制台应用程序,它加载位图图像进行一些操作并将输出写入另一个位图。 现在我想在我的应用程序之上构建一个 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 可以更轻松地完成此操作,但这是出于学习目的。

【问题讨论】:

  • 能否包含您正在尝试阅读的示例 BMP?这将使其他人能够重现您的结果。如果压缩,此代码将不起作用。肯定是Grayscale8吗?顺便说一句,为什么要使用循环来逐个字符地读取标题,而不是像下面使用像素数据那样使用单个 fread?
  • 您可以将整个文件读入内存并使用QImage::loadFromData()QImage(QString filename),而不是使用接受const uchar *buf 的QImage 构造函数。如果这返回不同的结果,则您对标头的解析或您的数据解释是错误的/不完整的。
  • 您好,这里是一个示例文件的链接:这是一个示例图像的链接:filebin.net/bny9bepzt06h45l4
  • 嗨 Martin,我正在遍历缓冲区中的每个值,然后将其添加到图像中,如下所示: int color = (int)_imgInBuffer[row * img.width() + col]; img.setPixel(col, row, qRgb(color, color, color));这很有效,所以我确实在缓冲区中有所有像素信息。但我希望找到一种更简单的方法来显示数据。我将格式更改为 Format_RGB444。由于图像是灰度图像,我将每个通道设置为相同的值。

标签: c++ qt


【解决方案1】:

我不知道我做错了什么,但现在它可以正常工作了。但是在 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));
    }
}

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

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 2017-10-10
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多