【问题标题】:Raw data to QImage原始数据到 QImage
【发布时间】:2014-11-14 23:39:44
【问题描述】:

我是图形编程的新手(像素、图像等) 我正在尝试将原始数据转换为 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));

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

【问题讨论】:

  • 如果您要使用QPixmap::fromImage,则无需动态创建img,因为它为像素图分配堆内存。并且QImage 在写入时使用复制。

标签: qt qimage


【解决方案1】:

总的来说是对的。 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] 一样使用它,我错了吗?
  • 不,&amp;rawData[y] 不正确,因为您将多次复制相同的像素。您应该使用:rawData.constData() + y * img-&gt;bytesPerLine()。在这种情况下,每次迭代都会复制新的数据。
  • 我在这里遇到了另一个问题。我不知道图片应该多长,我的意思是宽度和高度,有时当我传递小于 2kb 的数据时它会崩溃。。计算它的最佳方法是什么?
  • 创建新问题怎么样?你从哪里读取数据?为什么不知道图片的大小?你能详细描述一下你在做什么吗?
  • 好的,会写新问题:)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    并且将在函数完成时适当地释放。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      相关资源
      最近更新 更多