【发布时间】: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。由于图像是灰度图像,我将每个通道设置为相同的值。