Qt 将原始数据发送到QImage

Qt 将原始数据发送到QImage,qt,qimage,Qt,Qimage,我不熟悉图形编程(像素、图像等) 我正在尝试将原始数据转换为QImage并在QLabel上显示它。问题是,原始数据可以是任何数据(它实际上不是图像原始数据,而是二进制文件) 如果这是因为,为了深入了解像素和类似的东西是如何工作的,我知道我会得到随机图像,结果很奇怪,但它会工作的。 我在做这样的事情,但我认为我做错了 QImage *img = new QImage(640, 480, QImage::Format_RGB16); //640,480 size picture. //here I'

我不熟悉图形编程(像素、图像等) 我正在尝试将原始数据转换为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));
QImage*img=新的QImage(640480,QImage::Format_RGB16)//640480大小的图片。
//在这里,我尝试用随机像素填充新创建的QImage并显示它。
对于(int i=0;i<640;i++)
{
对于(int u=0;u<480;u++)
{
img->setPixel(i,u,rawData[i]);
}
}
ui->label->setPixmap(QPixmap::fromImage(*img));

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

总的来说,这是正确的
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());
}
QImage*img=新的QImage(640480,QImage::Format_RGB16);
对于(int y=0;yheight();y++)
{
memcpy(img->scanLine(y),rawData[y],img->bytesPerLine());
}

其中,
rawData
是一个二维数组。

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

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

img->setPixel(i, u, QRbg(##FFRRGGBB));
其中###FFRRGGBB是一个彩色四进制,当然,除非您需要单色8位支持

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

QImage image(640, 480, QImage::Format_something);
QPixmap::fromImage(image);
并将在功能完成后适当解除分配


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

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

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

如果要在为pixmap分配堆内存时使用
QPixmap::fromImage
,则无需动态创建
img
。和
QImage
使用写时复制。嗨,当我尝试你的例子时,所有原始数据显示相同的结果。rawData是QByteArray,我像&rawData[y]一样使用它,我错了,对吗?不,
&rawData[y]
不正确,因为您将多次复制相同的像素。您应该使用:
rawData.constData()+y*img->bytesPerLine()
。在这种情况下,每次迭代都会复制新的和平数据。我不知道图片应该有多长,我指的是宽度和高度,有时当我传递小于2kb的数据时,它会崩溃。。最好的计算方法是什么?创建新问题怎么样?你从哪里读取数据?你为什么不知道照片的大小?你能详细描述一下你在做什么吗?好的,我会写一个新问题:)