现象
Qt中当渲染显示的分辨率比原图片分辨率小时,就会有波纹。如下图所示,左边是正常显示,右边衬衫那里产生严重的波纹。这种波纹在计算机图形学叫摩尔纹,这是纹理贴图采样出现走样的现象,纹理分辨率过大时就会出现这种情况,关于这部分计算机图形学相关的知识网上有很多,我不是这方面的专业也讲不明白这些原理哈。
解决方式
了解了其中的原因,一个比较直接的处理方式就是把原图scale为需要显示的分辨率大小是可以解决这个问题。对于静态显示图片这种方式是可行,因为只需处理scale一次就好了。但如果图片支持缩放,那每缩放一次就要scale一次,如果是大分率图片那就会卡顿了。
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
auto image = m_image.scaled(QSize(500 , 500 )
, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
painter.drawImage(QRect(0, 0, image.width(), image.height()), image);
QMainWindow::paintEvent(event);
}
对于计算机图形学来说,可以使用Mipmap、Ripmap或其他算法进行改进。在QML中是支持启用Mipmap的,因为QML默认是使用opengl进行渲染,opengl有Mipmap相关算法的支持。
对于Mipmap的原理,需要了解的可以另外查找资料。
QML中Image控件是支持Mipmap设置,默认是没有启用。Image也可以使用上面说的scale后再显示,设置sourceSize为显示的大小就是这种效果。不设置sourceSize直接设置Mipmap也可以。
Image {
id: imaItem
width: 500
height: 500
sourceSize: Qt.size(width, height)
// mipmap: true
source: "qrc:/22.jpg"
}
如果是使用QQuickPaintedItem绘制图片,则可以使用setMipmap进行设置
放上原图,这个图比较明显,适合拿来测试