【问题标题】:Better way to load QPixmap data加载 QPixmap 数据的更好方法
【发布时间】:2012-06-27 23:31:56
【问题描述】:

更好的方法(没有QImage)?:

QImage image(width, height, QImage::Format_RGB888);
memcpy(image.bits(), m_frameRGB->data[0], height * width * 3);
QPixmap pixmap = QPixmap::fromImage(image);

我看不出有任何理由使用QImage 作为中间缓冲区,但QPixmap::loadFromData 不使用此上下文加载数据:

pixmap.loadFromData(m_frameRGB->data[0], height * width * 3); // Need pixmap resize?

【问题讨论】:

标签: c++ c qt qimage qpixmap


【解决方案1】:

文档说:“如果未指定格式(这是默认格式),则加载程序会探测文件的标题以猜测文件格式”。您只提供指向原始图像字节的指针,但您必须在缓冲区的开头提供一个标头,例如对于未压缩的 PPM 格式。

编辑: 您还可以测试 Roku 的建议以使用将图像数据作为参数的 QImage 构造函数,但请参阅文档中的注释:“缓冲区必须在 QImage 的整个生命周期内保持有效。”

【讨论】:

  • pixmap.loadFromData(m_frameRGB->data[0], height * width * 3, "PPM"); // 还是不行,返回false
  • 显然您的数据不是 PPM 格式,所以这不起作用。您的数据似乎只是没有任何 jpg/ppm/png/... 标头的原始像素数据。所以你需要从 QImage 创建 QPixmap。
  • 就像以前一样,我想......所以没有其他更快和优化的方法将像素数据映射到小部件(没有 opengl)?
  • 我应该可以在包含“P6 width_in_ascii height_in_ascii 255”的缓冲区前面添加一个 PPM 标头。参见例如netpbm.sourceforge.net/doc/ppm.html
  • 谢谢,它有帮助。它正在工作,而且速度更快......比从 QImage::fromImage() 加载快一点
【解决方案2】:

按照hmuelner 提示并...确实比QPixmap pixmap = QPixmap::fromImage(image); 快一点

QPixmap pixmap(height, width);
QByteArray pixData;
pixData.append(QString("P6 %1 %2 255 ").arg(width).arg(height));
pixData.append((char *)m_frameRGB->data[0], width * height * 3);
pixmap.loadFromData((uchar *)pixData.data(), pixData.size());

【讨论】:

  • 用QBENCHMARK做基准,从QImage转换快10倍
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多