快速的QPixmap缩放

Fast QPixmap scaling

本文关键字:缩放 QPixmap      更新时间:2023-10-16

我开发了一个类似浏览器的应用程序,其中画布具有较大的高度和"普通"宽度,类似于1024x999999。我使用 512 个缓存的 QPixmap 块 (1024x128) 显示图片,重复使用它们来显示新的绘图区域。因此,如果用户在大图像的某个给定区域滚动,则 CPU 不忙,则使用缓存的块。所以,这就是我的引擎的工作原理,简而言之。

想要实现缩放。不知道 - 平滑或离散(x2,x3,x4...)。性能问题:

  • 有没有有效的方法可以在paintEvent()中即时扩展QPixmap而不分配太多内存?
  • 或者,也许我应该考虑为不同的缩放系数缓存缩放图片的"缩放图层"?但这会使平滑缩放变得不可能...

如果您查看文档,您会发现paintEvent实际上接收了一个QPaintEvent对象。此对象具有一个名为 region() 的 getter 方法,该方法返回一个详细说明要重新绘制的区域的QRect

void QWidget::paintEvent ( QPaintEvent * event )
{
  QRect region = event->region();
  ...
}

所以......你只需要重新绘制小部件中正好位于该矩形内的部分。

对于您的应用程序,我建议计算矩形内有多少图像,并相应地重绘它们,但只重绘这些图像。

对于缩放部分,如果图像是QPixmap对象,Qt优化了在QPainter对象中绘制图像的方式。或者他们说...

因此,您可以在 paintEvent() 方法中编写如下内容:

QPainter painter(this);
...
painter.drawPixmap(pos_x, pos_y, width, height, pixmap);
...

希望有帮助!