Вы задаете неправильный намек рендера, вам нужно QPainter::SmoothPixmapTransform
чтобы получить плавное изменение размера. По умолчанию используется метод ближайшего соседа, который является быстрым, но имеет очень низкое качество и пикселирует результат.
QPainter::HighQualityAntialiasing
предназначен для рисования линий и путей заполнения и т. Д., Например, при растрировании с использованием бэкэнда OpenGL, он не влияет на рисование растровой графики.
EDIT: Кажется, есть только так много SmoothPixmapTransform
может сделать, и когда конечный результат настолько малы, что не так много:
QPainter p(this);
QPixmap img("e://img.png");
p.drawPixmap(QRect(50, 0, 50, 50), img);
p.setRenderHint(QPainter::SmoothPixmapTransform);
p.drawPixmap(QRect(0, 0, 50, 50), img);
img = img.scaled(50, 50, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
p.drawPixmap(100, 0, img);
Этот код дает следующий результат:
Существует едва ли разница между вторым и третьим изображением, вручную масштабируя исходное изображение до требуемых размеров, и его рисование дает наилучший результат. Это, конечно, не так, от SmoothTransformation
ожидается получение того же результата, но по какой-то причине его масштабирование уступает scale()
методу QPixmap
.
Thanks.i попробовал то, что вы сказали, но результат тот же! – IMAN4K
Я обновил свой вопрос – IMAN4K
@ IMAN4K насколько велика оригинальная картина? – dtech