c++ - 快速 QPixmap 缩放

标签 c++ qt zooming scaling qpixmap

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

想要实现缩放。不知道 - 平滑还是离散(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);
...

希望有帮助!

关于c++ - 快速 QPixmap 缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10752284/

相关文章:

Javascript缩放效果?

c++ - 力扣 : TwoSum Solution

c++ - 我需要一些 C++ 结构建议

c++ - 读取数据文件C++中的多个项目

c++ - qt,使用freeglut,错误 'glutInit'

c++ - Qt 和 OpenGL : texture transparency

android - 如何在android中滚动时聚焦时自动缩放图像

javascript - D3.js 可缩放旭日不缩放

c++ - 在等待 std::condition_variable 时如何处理系统时钟的变化?

qt - 画一个实心圆