【问题标题】:Build and draw big image on Qt在 Qt 上构建和绘制大图像
【发布时间】:2026-02-22 14:40:01
【问题描述】:

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

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

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

现在我有一个问题。图像可能非常大。 QImage 将数据存储在内存中,不能存储大图像。我想将生成的图像存储在磁盘上,并以任何缩放快速绘制它的任何部分。我该怎么做?

【问题讨论】:

    标签: image qt draw deepzoom


    【解决方案1】:

    您可能想查看这篇描述QPixmapQImage 之间差异的文章:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      我将如何完成这项任务...

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

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

      为了在文件中定位,使用简单的查找表,例如xId yId offset length

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

      【讨论】: