绘制太大的图像无法适应Qimage

Draw an image too big to fit into a QImage

本文关键字:Qimage 图像 绘制      更新时间:2023-10-16

我需要显示一个可能很大的图表,例如,图像分辨率可能是100 000 x1000。但是,我似乎仅限于32768 x 32768 the qimage。

我无法在每个paintEvent上直接重新绘制图表,因此我需要将其存储到qimage中(可能是一个不会更改任何内容的qpixmap)。但是,它不合适。

我的第一个想法是:

  • 创建QImage的列表
  • 各种QImage
  • 的情节
  • 使用良好的QImages。
  • 重新绘制

第一个和最后一点很容易完成。但是第二点更为复杂。我非常有信心我的方法会起作用,但是它需要超载基本的油漆方法(绘制矩形,圆形等),以便能够在多个图像上绘画。

所以,在进行进一步之前,我想知道其他选择是什么。

您可能不想一次显示多个QImage数据。很少有屏幕超过32K像素宽或高。

因此,您想要一种抽象类型,该类型按要求,在偏移和不同的变焦因素上生产 QImage s。

下一个问题是修改此抽象类型。一个易于使用的,不是最大性能版本包括让用户打入内部存储(无论是什么)。

用户仍然必须"拼贴"他们的努力,但可以以方便他们的方式拼贴他们的努力。

更高的性能版本暴露了一些基础实现,我们尚未提及。

大图像的传统实现是瓷砖图像。您的图像瓷砖网格彼此相连。当某人要求从您的图像中闪电时,您会产生临时的QImage,然后将适当的瓷砖闪烁。当有人向您融合时,您会弄清楚适当的瓷砖是什么,然后在其中的一部分上写下该源的部分QImage

较高的性能接口公开了这些瓷砖。

低级接口让外部知道您的瓷砖在哪里,并让他们要求它们。这是一个差的界面。

更好的接口揭示了子瓷砖迭代器。他们要求一个区域,您返回一对描述该地区的迭代器。迭代器中的数据包括该瓷砖中的瓷砖和区域以及该区域在"完整图像"中的位置,或一个子瓷砖对象(带有列层,线长度等)以及的位置亚瓷器对象。

另一个好的接口是foreach样式接口。同样,大图像类的用户通过他们想与之一起工作的区域中传递,但也是一个回调。该回调类似于迭代器解除的上述结果中的任何一个。

这种方法比迭代器方法具有两个大优势。首先,您可以在大图像类中实现并行图像处理算法。其次,写作要比滚动自己的迭代器要容易得多。

一旦您拥有其中的任何一个,绘图都相对容易。确定您要绘制的区域(大方)。迭代产生的瓷砖。在每个瓷砖上,将瓷砖的偏移涂在图纸上后绘制。

您可以使用QT图形视图框架。为其创建QGraphicsViewQGraphicsScene。使用QGraphicsScene::addPixmap(返回QGraphicsPixmapItem返回QGraphicsItem的CC_14)添加项目,并使用QGraphicsItem::setPos调整其位置。QGraphicsView将有效地绘制您的场景,并在必要时处理滚动和缩放。

您确实意识到100,000 x 1000 rgba qimage是400米吗?浪费所有记忆是没有意义的。真的,没有。

paintEvent中的每次都需要绘制一个请求。对此要聪明,以便您只绘制需要显示的内容。我认为应该专注于优化绘画过程和您的数据结构,以便可以有效地绘画。

在小尺度上(缩放),可以通过近似/删除/插值数据来获得很多,以使其看起来相同,但是您不会浪费时间绘制相同的像素太多次。

>