You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用QPainter::scale时如何保持QPixmap的drawPixmap绘制质量?

Qt QPainter缩放场景下保持前景图标画质无损的解决方案

在QWidget的paintEvent中使用QPainter::scale(zoom, zoom)缩放背景图时,需求是让前景图标始终保持固定尺寸且画质不受损失,但实际情况是:即便QPixmap原始尺寸未变,画质仍会随zoom值增大而下降。原代码尝试通过scaledToHeight缩放QPixmap后绘制,未能达到画质无损的预期。

原实现代码

void myPainter::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.scale(myZoom, myZoom);
    // ... 其他背景图绘制逻辑
    double tagSize = t->icon_->height() / zoom;
    QPoint tagpoint = rect().center();
    p.drawPixmap(tagpoint, t->icon_->scaledToHeight(tagSize, Qt::SmoothTransformation));
}

问题原因

原方案中,先对整个QPainter应用了缩放变换,再对图标进行缩小后绘制,相当于图标经历了两次缩放操作(先缩小像素尺寸,再被QPainter的缩放放大),这会导致像素信息丢失,画质下降。

可行解决方案

通过临时抵消QPainter的全局缩放,直接绘制原始QPixmap,再恢复缩放的方式,可避免画质损失。同时需要结合zoom值修正绘制坐标,保证图标位置正确:

// 已执行p.scale(myZoom, myZoom)绘制背景后
p.scale(1/zoom, 1/zoom); // 临时取消全局缩放
p.drawPixmap(tagpoint * zoom, *t->icon_); // 坐标乘以zoom修正位置
p.scale(zoom, zoom); // 恢复全局缩放,继续后续绘制

内容的提问来源于stack exchange,提问作者JoeliP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:57:33