原始数据到QImage

时间:2013-01-28 13:32:41

标签: qt qimage

我是图形编程的新手(像素,图像等......) 我正在尝试将原始数据转换为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));
我正确地做到了吗?顺便问一下,你能指出我应该在哪里学习这些东西吗?谢谢!

3 个答案:

答案 0 :(得分: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是一个二维数组。

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

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

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

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

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

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

并且在功能完成时将适当地解除分配。

Qt Examples目录是搜索功能的好地方。另外,仔细阅读课程文档,因为它们充满了例子。