在这篇文章之前首先介绍一下百度上找到的方法:
QPixmap pixmapToRound(QPixmap &src, int radius)
{
if(src.isNull())
{
return QPixmap();
}
QPixmap pix(src.width(), src.height());
pix.fill(Qt::transparent); //设置图片透明
QPainter painter(&pix);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
QPainterPath path;
path.addEllipse(src.rect().center(), radius, radius);
painter.setClipPath(path);
painter.drawPixmap(QRect(src.width() / 2 - radius, src.height() / 2 - radius,
radius * 2, radius * 2), src);
return pix;
}
如上述代码所示,百度上一搜索基本上都是这一个教程。该教程描述的是使用该方法可以获得一个没有锯齿的圆形图片。
很可惜,经过测试,当目标图片和原图片尺寸相差太大时,图片四周仍然有锯齿,且获取到的目标图片精度太低太低。。。。
于是在上述代码的基础上我做了一定的修改。
1、首先将图片进行缩放,通过平滑缩放,将图片缩放到目标尺寸,这样可以保留精度。
2、绘制圆的时候将图片原点设置为绘制原点,可以尽可能的保留图片元素。
代码如下:
QPixmap PixmapToRound(const QPixmap &src, int radius)
{
if (src.isNull())
{
return QPixmap();
}
//按比例缩放
QPixmap pixmapa;
if(src.width() != radius || src.height() != radius)
{
pixmapa = src.scaled(radius, radius, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
}
else
{
pixmapa = src;
}
QPixmap pixmap(radius,radius);
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing);
QPainterPath path;
path.addEllipse(0, 0, radius, radius);
painter.setClipPath(path);
painter.drawPixmap(0, 0, radius, radius, pixmapa);
return pixmap;
}