2014-02-18 2 views
2

В настоящее время мы используем коммерческую библиотеку для рендеринга изображений с Windows. При отображении черно-белых изображений в размерах меньших, чем изображения исходного размера, эта библиотека серый масштабирует изображения так, что до сих пор большинство из них могут быть признаны:QImage dithering quality

enter image description here

Теперь я попробовал то же самое с 4.8 Применение Qt. В принципе, Что сделано звонит:

QImage mImage; 
... 
mImage.load(...); 
... 
painter.drawImage(paintRect, mImage, mImage.rect()); 

Где paintRect меньше mImage.rect(). Это хорошо работает, но выход гораздо меньше удовлетворения:

enter image description here

Я попробовал несколько renderHints (QPainter :: SmoothPixmapTransform, Сглаживание, HighQualityAntialiasing), а также преобразовал изображение с помощью

mImage = mImage.convertToFormat(QImage::Format_RGB32); 

QPainter: : SmoothPixmapTransform, похоже, немного улучшил выход (его включили в снимок экрана). Все остальное ничего не меняет.

Я что-то не хватает?

Как можно улучшить изображение изображений с уменьшением размера?

+0

Вы сохраняете соотношение сторон? вы попробовали предварительное масштабирование изображения с помощью 'QImage :: scaled' – UmNyobe

+0

Соотношение сторон: не требуется нашим приложением, но в этих случаях я это сделал, да. Отсутствие предварительного масштабирования, пользователь увеличивает и уменьшает масштаб, и поэтому коэффициент масштабирования всегда изменяется. –

ответ

4

Вполне возможно, что во время

painter.drawImage(paintRect, mImage, mImage.rect()); 

художник просто интерполировать, какой пиксель, чтобы взять в исходном изображении, когда размер отличается. Это объяснит второе изображение.

Scale руководство с помощью

QImage todraw = mImage.scaled(
      paintRect.size(), 
      Qt::IgnoreAspectRatio, 
      Qt::SmoothTransformation); 
... 
painter.drawImage(paintRect, todraw, mImage.rect()); 

Вы вычислить образ todraw только на изменении размера (чтобы избежать масштабирования каждого события краски) и использовать его вместо того, чтобы с художником.

+1

Действительно, это имеет значение. Удивительно. Я думаю, что это ошибка. Спасибо –

+1

@REDSOFTADAIR Это не ошибка. QPainter :: drawImage просто не выполняет линейную интерполяцию при масштабировании изображения. У этого никогда не было такого поведения. Ваше использование SmoothPixmapTransform не сработало, потому что вы не работаете с pixmaps. Использование вами настроек сглаживания не имело эффекта, поскольку эти проблемы не связаны с сглаживанием. –