使用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
相关产品推荐
相关产品推荐

