如何在不复制 QGraphicsScene 的情况下显示 QImage
How to show a QImage without copying in QGraphicsScene
我有自己的图像 class,其中包含一个带 RGB 值的无符号字符数组。我想在 QGraphicsScene 中显示存储在此 class 中的图像,而不复制它们。我可以用
制作一个 QImage
QImage image(data, width, height, width * 3, QImage::Format_RGB888);
没有复制我的图像。如何在没有深度数据副本的情况下在 QGraphicsScene 中显示图像?
对于显示图像QPixmap是一个合适的class。 QGraphicsScene pdo提供了一个只针对QPixmap的方法。
QGraphicsPixmapItem * QGraphicsScene::addPixmap(const QPixmap & pixmap)
但是,QPixmap 是优化的 class 图像显示,因此无法使用现有内存块创建它。因此,如果您打算在 QGraphicsScene 中将您的内存数据显示为图像,这似乎是不可能的(合理的努力)。
为什么您担心将数据从 class 复制到 QPixmap?是否有证据表明它将成为性能瓶颈?
如果不是,您可以将 class 直接转换为 QPixmap 或使用 QPixmap::fromImage()。
添加您的图片,例如:
myScene->addPixmap( QPixmap::fromImage(myImage) );
默认情况下,光栅绘制 engine/backend,顶级小部件的内容存储为 QImage
。在上面画一个 QImage
(还有一个 QPixmap
)很快而且不涉及复制。具有光栅后端的 QPixmap
在内部只是一个 QImage
,其格式与后备存储的格式相同。像素图通常不代表任何本机资源句柄 - 因为除非您明确要求其他内容,否则您正在使用光栅后端。
所以您希望做的是在 QGraphicsItem::paint
实现中直接从您的源图像中 drawImage
。幕后真正发生的是 paint
在后备存储上执行 - QImage
,这是快速且高效的。您使用的 QPainter
在 QImage
!
上运行
您所要做的就是实现类似于 QGraphicsPixmapItem
的 QGraphicsImageItem
。只要您的源图像与支持顶级 window 的图像具有相同的格式,就不会涉及复制和格式转换。你怎么知道的?只需询问后备存储它的格式。
QImage::Format backingStoreFormat(QWidget * widget) {
auto store = dynamic_cast<QImage*>(widget->backingStore()->paintDevice())
return store ? store->format() : QImage::Format_Invalid;
}
我把 QGraphicsImageItem
的实现留给 reader :)
我有自己的图像 class,其中包含一个带 RGB 值的无符号字符数组。我想在 QGraphicsScene 中显示存储在此 class 中的图像,而不复制它们。我可以用
制作一个 QImageQImage image(data, width, height, width * 3, QImage::Format_RGB888);
没有复制我的图像。如何在没有深度数据副本的情况下在 QGraphicsScene 中显示图像?
对于显示图像QPixmap是一个合适的class。 QGraphicsScene pdo提供了一个只针对QPixmap的方法。
QGraphicsPixmapItem * QGraphicsScene::addPixmap(const QPixmap & pixmap)
但是,QPixmap 是优化的 class 图像显示,因此无法使用现有内存块创建它。因此,如果您打算在 QGraphicsScene 中将您的内存数据显示为图像,这似乎是不可能的(合理的努力)。
为什么您担心将数据从 class 复制到 QPixmap?是否有证据表明它将成为性能瓶颈?
如果不是,您可以将 class 直接转换为 QPixmap 或使用 QPixmap::fromImage()。 添加您的图片,例如:
myScene->addPixmap( QPixmap::fromImage(myImage) );
默认情况下,光栅绘制 engine/backend,顶级小部件的内容存储为 QImage
。在上面画一个 QImage
(还有一个 QPixmap
)很快而且不涉及复制。具有光栅后端的 QPixmap
在内部只是一个 QImage
,其格式与后备存储的格式相同。像素图通常不代表任何本机资源句柄 - 因为除非您明确要求其他内容,否则您正在使用光栅后端。
所以您希望做的是在 QGraphicsItem::paint
实现中直接从您的源图像中 drawImage
。幕后真正发生的是 paint
在后备存储上执行 - QImage
,这是快速且高效的。您使用的 QPainter
在 QImage
!
您所要做的就是实现类似于 QGraphicsPixmapItem
的 QGraphicsImageItem
。只要您的源图像与支持顶级 window 的图像具有相同的格式,就不会涉及复制和格式转换。你怎么知道的?只需询问后备存储它的格式。
QImage::Format backingStoreFormat(QWidget * widget) {
auto store = dynamic_cast<QImage*>(widget->backingStore()->paintDevice())
return store ? store->format() : QImage::Format_Invalid;
}
我把 QGraphicsImageItem
的实现留给 reader :)