如何在QGraphicsScene中显示不复制的QImage

How to show a QImage without copying in QGraphicsScene

本文关键字:复制 QImage 显示 QGraphicsScene      更新时间:2023-10-16

我有自己的图像类,其中包含具有RGB值的无符号字符数组。我想在QGraphicsScene中显示存储在该类中的图像,而不复制它们。我可以用

创建一个QImage
QImage image(data, width, height, width * 3, QImage::Format_RGB888);

不复制我的图像。我如何在没有数据的深度拷贝的QGraphicsScene中显示图像?

使用默认的栅格绘制引擎/后端,顶级小部件的内容存储为QImage。在上面画一个QImage(和一个QPixmap)是快速的,不涉及副本。具有光栅后端的QPixmap在内部只是一个QImage,具有与后备存储相同的格式。pixmap通常不代表任何本地资源句柄——因为你使用的是栅格后端,除非你明确地要求其他东西。

因此,您希望做的是在QGraphicsItem::paint实现中直接从源图像中获取drawImage。在幕后真正发生的是paint在后备存储上执行——一个QImage,这是快速和高效的。您使用的QPainterQImage进行操作!

你所要做的就是实现类似于QGraphicsPixmapItemQGraphicsImageItem。只要您的源图像与支持顶层窗口的图像具有相同的格式,就不会涉及复制和格式转换。你怎么知道的?只要问后台存储它是什么格式。

QImage::Format backingStoreFormat(QWidget * widget) {
  auto store = dynamic_cast<QImage*>(widget->backingStore()->paintDevice())
  return store ? store->format() : QImage::Format_Invalid;
}

我把QGraphicsImageItem的实现留给读者:)

对于显示图像QPixmap是一个合适的类。QGraphicsScene提供了一个QPixmap的方法。

QGraphicsPixmapItem * QGraphicsScene::addPixmap(const QPixmap & pixmap)

然而,QPixmap是一个用于显示图像的优化类,所以它不能用现有的内存块创建。因此,如果您打算在QGraphicsScene中显示您的内存数据作为图像,这似乎是不可能的(合理的努力)。

为什么你关心从你的类复制数据到QPixmap?是否有证据表明,这将是一个性能瓶颈?

如果没有,要么直接将类转换为QPixmap,要么使用QPixmap::fromImage()。添加您的图像,例如:

myScene->addPixmap( QPixmap::fromImage(myImage) );