我正在从头开始编写图像库,我编写了一个控制台应用程序,该程序加载了位图图像,并进行了一些操作并将输出写入另一个位图。 现在,我想在我的应用程序之上构建一个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
可以轻松得多,但这只是出于学习目的。
答案 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));
}
}
我不知道为什么需要为灰度图像设置红色,绿色,蓝色值,但这是完成它的唯一方法。