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));

我做得对吗?顺便问一下,你能指出我应该在哪里学习这些东西吗?谢谢!

4

3 回答 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是一个二维数组。

于 2013-01-28T13:53:54.887 回答
4

这就是我将原始 BGRA 帧保存到磁盘的方式:

QImage image((const unsigned char*)pixels, width, height, QImage::Format_RGB32);
image.save("out.jpg");
于 2014-11-14T15:39:44.323 回答
0

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

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

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

其中##FFRRGGBB是彩色四联体,当然,除非您想要单色 8 位支持。

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

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

并将在功能完成后适当地释放。

Qt 示例目录是搜索功能的好地方。此外,请仔细阅读类文档,因为它们充满了示例。

于 2013-01-28T14:00:49.103 回答