• 根据指定的原始图像和掩码图像,生成一个圆形图像


    1. QPixmap BasicWindow::getRoundImage(const QPixmap &src, QPixmap &mask, QSize maskSize)
    2. {
    3. if (maskSize == QSize(0, 0))//如果是00 就用空的尺寸大小
    4. {
    5. maskSize = mask.size();
    6. }
    7. else
    8. {//KeepAspectRatio尽可能大的矩形进行缩放 SmoothTransformation装换的模式 平滑
    9. mask = mask.scaled(maskSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);//根据尺寸大小进行缩放
    10. }
    11. //保存转换后的图像
    12. QImage resultImage(maskSize, QImage::Format_ARGB32_Premultiplied);//格式进行转换 这样转换后的图像会比较清晰
    13. QPainter painter(&resultImage);//用结果图像进行初始化
    14. //设置图片叠加模式 CompositionMode_Source将原图像用复制的方式进行操作
    15. painter.setCompositionMode(QPainter::CompositionMode_Source);//输出圆头像的像素
    16. painter.fillRect(resultImage.rect(), Qt::transparent);//填充矩形 是透明分
    17. painter.setCompositionMode(QPainter::CompositionMode_SourceOver);//
    18. painter.drawPixmap(0, 0, mask);//画
    19. painter.setCompositionMode(QPainter::CompositionMode_SourceIn);//叠加方式进入
    20. painter.drawPixmap(0, 0, src.scaled(maskSize,Qt::KeepAspectRatio, Qt::SmoothTransformation));//画
    21. painter.end();
    22. return QPixmap::fromImage(resultImage);
    23. }

    这段代码是一个函数`getRoundImage`,用于获取圆形图像。下面是对代码的解释:

    首先,该函数接受三个参数:原始图像`src`、掩码图像`mask`和掩码尺寸`maskSize`。

    如果`maskSize`为`(0, 0)`,则将使用`mask`的实际尺寸作为掩码尺寸。否则,将根据指定的`maskSize`对`mask`进行缩放操作,使用`Qt::KeepAspectRatio`和`Qt::SmoothTransformation`参数来保持图像的长宽比并平滑地进行转换。

    之后,创建一个与掩码尺寸相同的`QImage`对象`resultImage`,像素格式设置为`QImage::Format_ARGB32_Premultiplied`,以实现更清晰的图像。

    使用`QPainter`对象`painter`初始化`resultImage`。

    接下来,设置绘图模式为`QPainter::CompositionMode_Source`,将原图像的像素输出到`resultImage`中,并用透明色填充整个矩形区域。

    然后,设置绘图模式为`QPainter::CompositionMode_SourceOver`,使用`drawPixmap`方法在指定位置绘制`mask`。

    再次设置绘图模式为`QPainter::CompositionMode_SourceIn`,使用`drawPixmap`方法在指定位置绘制经过缩放的原始图像`src`。

    最后,结束绘画操作,将`resultImage`转换为`QPixmap`对象,并返回该对象。

    总体而言,这段代码的作用是根据指定的原始图像和掩码图像,生成一个圆形图像。

  • 相关阅读:
    MySQL基础操作总结_CRUD
    最难的IB课程为什么含金量最高?
    软件测试 -- 进阶 5 软件测试用例
    从入门到进阶 之 ElasticSearch 文档、分词器 进阶篇
    机械臂运动控制,通讯的解包->运动控制->数据封包上报过程
    【SVN】
    基于vue-cli创建后台管理系统前端页面——element-ui,axios,跨域配置,布局初步,导航栏
    胆囊结石的危害你了解多少?
    javaee springMVC日期类型转换之通过注解的方式
    c语言---指针
  • 原文地址:https://blog.csdn.net/m0_46376834/article/details/133971077