在Qt上构建并绘制大图像

时间:2011-07-19 15:31:31

标签: image qt draw deepzoom

我的程序使用复杂的规则创建图像,然后在QScrollArea中显示它。目前我这样做:

  • 创建QImage
  • 使用QImage :: setPixel
  • 填充它
  • 将我的小部件(从QWidget派生)添加到QScrollArea
  • 在widget中定义paintEvent并使用QPainter :: drawImage

显示生成的图像是最简单的方法吗?

现在我遇到了问题。图像可能非常大。 QImage将数据存储在内存中,无法存储大图像。我想将生成的图像存储在磁盘上,并快速绘制任何缩放的任何部分。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您可能希望查看本文,介绍QPixmapQImage之间的一些差异:

http://techbase.kde.org/Development/Tutorials/Graphics/Performance#QPixmap_vs._QImage

如果你想快速缩放非常大的图像,有一种方法,称为“深度缩放”和“Zoomable用户界面”(ZUI):

http://en.wikipedia.org/wiki/Deep_Zoom

QScrollArea并非设计用于开箱即用。我不知道Qt实现,但我个人使用了一个名为OpenZoom的开源Flash。你可以看到我的结果:

http://hostilefork.com/2010/09/12/imagination-squared-plus-openzoom/

很高兴看到有人以可重复使用的方式为Qt解决这个问题。

答案 1 :(得分:1)

显示生成图像的最简单方法是将其分配给QLabel。使用QLabel::SetPixmap()代替您自己的小部件。

我该怎么做......

首先,创建许多具有足够大尺寸(1024x1024甚至更小)的单独图像。

之后制作一个图像矩阵。您可以逐个读取和写入其图像。如果您需要显示图像的某些部分 - 只需从文件中读取所需的图像。

用于定位文件使用简单查找表,其中包含xId yId offset length

等字段

快速处理缩放 - 只需添加更多矩阵 - 下一个应该比基础小两倍,依此类推,直到你有一个单独的图像(对于最远的缩放)。