绘制太大的图像无法适应Qimage
Draw an image too big to fit into a QImage
我需要显示一个可能很大的图表,例如,图像分辨率可能是100 000 x1000。但是,我似乎仅限于32768 x 32768 the qimage。
我无法在每个paintEvent
上直接重新绘制图表,因此我需要将其存储到qimage中(可能是一个不会更改任何内容的qpixmap)。但是,它不合适。
我的第一个想法是:
- 创建
QImage
的列表 - 各种
QImage
的情节 - 使用良好的
QImage
s。
重新绘制
第一个和最后一点很容易完成。但是第二点更为复杂。我非常有信心我的方法会起作用,但是它需要超载基本的油漆方法(绘制矩形,圆形等),以便能够在多个图像上绘画。
所以,在进行进一步之前,我想知道其他选择是什么。
您可能不想一次显示多个QImage
数据。很少有屏幕超过32K像素宽或高。
因此,您想要一种抽象类型,该类型按要求,在偏移和不同的变焦因素上生产 QImage
s。
下一个问题是修改此抽象类型。一个易于使用的,不是最大性能版本包括让用户打入内部存储(无论是什么)。
用户仍然必须"拼贴"他们的努力,但可以以方便他们的方式拼贴他们的努力。
更高的性能版本暴露了一些基础实现,我们尚未提及。
大图像的传统实现是瓷砖图像。您的图像瓷砖网格彼此相连。当某人要求从您的图像中闪电时,您会产生临时的QImage
,然后将适当的瓷砖闪烁。当有人向您融合时,您会弄清楚适当的瓷砖是什么,然后在其中的一部分上写下该源的部分QImage
。
较高的性能接口公开了这些瓷砖。
低级接口让外部知道您的瓷砖在哪里,并让他们要求它们。这是一个差的界面。
更好的接口揭示了子瓷砖迭代器。他们要求一个区域,您返回一对描述该地区的迭代器。迭代器中的数据包括该瓷砖中的瓷砖和区域以及该区域在"完整图像"中的位置,或一个子瓷砖对象(带有列层,线长度等)以及的位置亚瓷器对象。
另一个好的接口是foreach
样式接口。同样,大图像类的用户通过他们想与之一起工作的区域中传递,但也是一个回调。该回调类似于迭代器解除的上述结果中的任何一个。
这种方法比迭代器方法具有两个大优势。首先,您可以在大图像类中实现并行图像处理算法。其次,写作要比滚动自己的迭代器要容易得多。
一旦您拥有其中的任何一个,绘图都相对容易。确定您要绘制的区域(大方)。迭代产生的瓷砖。在每个瓷砖上,将瓷砖的偏移涂在图纸上后绘制。
您可以使用QT图形视图框架。为其创建QGraphicsView
和QGraphicsScene
。使用QGraphicsScene::addPixmap
(返回QGraphicsPixmapItem
返回QGraphicsItem
的CC_14)添加项目,并使用QGraphicsItem::setPos
调整其位置。QGraphicsView
将有效地绘制您的场景,并在必要时处理滚动和缩放。
您确实意识到100,000 x 1000 rgba qimage是400米吗?浪费所有记忆是没有意义的。真的,没有。
paintEvent
中的每次都需要绘制一个请求。对此要聪明,以便您只绘制需要显示的内容。我认为应该专注于优化绘画过程和您的数据结构,以便可以有效地绘画。
在小尺度上(缩放),可以通过近似/删除/插值数据来获得很多,以使其看起来相同,但是您不会浪费时间绘制相同的像素太多次。
>- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- QImage:加载图像时自动检测格式
- 加载图像约500次后,此错误显示在Visual Studio Qimage:不记忆,返回空图像
- 绘制太大的图像无法适应Qimage
- 如何使用Qimage计算图像中的像素
- 从灰度图像到QImage的快速转换
- 如何将多页Magick++图像转换为QImage
- Qt/C++-转换原始二进制数据并将其显示为图像(即QImage)
- 使用QImage和QRect显示图像
- QImage,可以更改资源图像的背景(png/jpg)
- opencv Qt如何有效地创建彩色图像并将其传递给QImage
- QImage::operator==对于具有相同内容的图像是否返回false ?
- 将图像分配给继承自Qimage的类的对象