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是这样的一张图: 非透明部分是你要切的形状,透明部分是你不要的地方。实际效果如下:
原图:
原图

切好的图:
切好的图

效果还不错吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值