我是图形编程的新手(像素,图像等......) 我正在尝试将原始数据转换为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));
我正确地做到了吗?顺便问一下,你能指出我应该在哪里学习这些东西吗?谢谢!
答案 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目录是搜索功能的好地方。另外,仔细阅读课程文档,因为它们充满了例子。