【问题标题】:Fast QPixmap scaling快速 QPixmap 缩放
【发布时间】:2012-05-31 21:50:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ qt zooming scaling qpixmap


    【解决方案1】:

    如果您查看文档,您会发现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);
    ...
    

    希望有所帮助!

    【讨论】:

    • 好的,谢谢! QPixmap 针对屏幕输出进行了优化,我使用它并且几乎可以零 CPU 成本绘制全屏窗口。但是到目前为止我看到的缩放方法正在返回新的 QPixmap 对象。我认为在每个paintEvent() 中都进行复制并不好。
    • 如果您已经在某个数组中计算了 QPixmap 实例,则不需要创建新实例,但是如果需要动态计算它们,那么是的,您必须实例化新的 @987654331 @s。如果这是您需要的,请接受答案。
    • 我在某个数组中计算了它们,但仅适用于缩放级别=1。那么我应该为另外 10 个缩放级别创建另外 10 个数组吗? :)
    • 如果它们缓存在缩放因子为 1 的数组中,因为您只需要绘制那些可见的,我认为记住它会消耗大量内存。
    • 对不起,没有得到答案(我的英语很差)。你说我必须在 paintEvent() 中动态缩放 QPixmaps 取决于缩放因子值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多