在有的时候我们必须使用程序来获得一个特定形状的图案,比如说我们要规定每一个用户的头像显示的是圆形的,这时候我们就需要进行切图。QPixmap自带一个setmask函数,但是这个函数的参数是一个bitmap,如果切一个矩形应该没问题,如果要切一个圆,那锯齿应该很多。所以要实现切图就是实现一个类似于setmask的函数。QPainter类给我们提供了一个混合模式的画图,基本上就是图像的 一些关系运算,覆盖啊,交啊,与啊,或啊 这样的运算。前提是图像必须是有透明通道的,不然运算有合意义?现在把代码贴出来:
void GetRundedRectImage(const QPixmap &src, QPixmap& dst, const QPixmap &mask)
{
QImage resultImage(mask.size(),QImage::Format_ARGB32_Premultiplied);
QPainter painter(&resultImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(resultImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawPixmap(0, 0, mask);
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
painter.drawPixmap(0, 0, src.scaled(mask.size()));
painter.end();
dst = QPixmap::fromImage(resultImage);
}
这里使用的Mask是这样的一张图: 非透明部分是你要切的形状,透明部分是你不要的地方。实际效果如下:
原图:
切好的图:
效果还不错吧!