Qt完美实现切图

在有的时候我们必须使用程序来获得一个特定形状的图案,比如说我们要规定每一个用户的头像显示的是圆形的,这时候我们就需要进行切图。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是这样的一张图: 非透明部分是你要切的形状,透明部分是你不要的地方。实际效果如下:
原图:
原图

切好的图:
切好的图

效果还不错吧!

Guess you like

Origin blog.csdn.net/qq_16952303/article/details/52068354