将原始数据转换为 QImage

7

我是新手在图形编程方面(像素、图片等等)。 我正试着将原始数据转换为QImage并显示在QLabel上。问题是,原始数据可以是任何数据(它实际上不是图像原始数据,而是二进制文件)。 这样做的原因是为了更深入地理解像素和类似的东西,我知道会得到带有奇怪结果的随机图像,但它会起作用。 我正在做类似于下面的事情,但我认为我的方法有误!

QImage *img = new QImage(640, 480, QImage::Format_RGB16); //640,480 size picture.
//here I'm trying to fill newly created QImage with random pixels and display it.
for(int i = 0; i < 640; i++)
{
    for(int u = 0; u < 480; u++)
    {
        img->setPixel(i, u, rawData[i]);
    }
}
ui->label->setPixmap(QPixmap::fromImage(*img));

我做得对吗?顺便问一下,你能告诉我在哪里可以学习这些东西吗?谢谢!


1
如果您要使用QPixmap :: fromImage,则无需动态创建img,因为它会为像素图分配堆内存。而且QImage使用写时复制。 - UmNyobe
3个回答

7

总体来说是正确的。 QImage 是一个允许直接操作其自身数据的类,但您应使用正确的像素格式。

以下是稍微更高效的示例:

QImage* img = new QImage(640, 480, QImage::Format_RGB16);
for (int y = 0; y < img->height(); y++)
{
    memcpy(img->scanLine(y), rawData[y], img->bytesPerLine());
}

这里的rawData是一个二维数组。


嗨,当我尝试你的例子时,所有原始数据都显示相同的结果。rawData是QByteArray,我使用它像这样&rawData[y],我错了吧? - Nika
不,&rawData[y] 不正确,因为你会重复复制相同的像素。你应该使用:rawData.constData() + y * img->bytesPerLine()。在这种情况下,在每次迭代中都会复制新的数据片段。 - york.beta
我在这里遇到了另一个问题。我不知道图片应该多长,也就是宽度和高度,有时候当我传递少于2kb的数据时,它会崩溃。有什么最好的方法来计算呢? - Nika
如何创建新问题?你从哪里读取数据?为什么不知道图片的大小?你能详细描述一下你正在做什么吗? - york.beta
好的,我会写一个新问题 :) - Nika

4

以下是我如何将原始的BGRA帧保存到磁盘上:

QImage image((const unsigned char*)pixels, width, height, QImage::Format_RGB32);
image.save("out.jpg");

0

从语法上看,您的代码似乎是正确的。

阅读类签名,您可能希望以以下方式调用setPixel:

img->setPixel(i, u, QRbg(##FFRRGGBB));

其中 ##FFRRGGBB 是颜色四元组,除非你需要单色8位支持。

此外,声明裸指针是危险的。以下代码是等价的:

QImage image(640, 480, QImage::Format_something);
QPixmap::fromImage(image);

并将在函数完成时适当地进行解除分配。

Qt示例目录是寻找功能的好地方。此外,浏览类文档,因为它们中有很多示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接