使用Qt给微信头像添加国旗

使用Qt给微信头像添加国旗

前言

国庆时看到微信很多人将头像加上国旗,于是心血来潮写下此程序,可能还有一些没有发现的bug,也欢迎各位指出,程序代码不大稍后会将代码贴出,主要是用画布画两张图片,并且设置顶层图片透明度的问题。因为心血来潮较短时间写了一下,代码观感以及错误可能会有,欢迎评论区或私信指出,我会在空闲时进一步优化

成品展示

  1. 界面设计
    在这里插入图片描述
  2. 功能展示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

代码

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPainter>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->coos,&QPushButton::clicked,this,&Widget::Openimg);
}

void Widget::Openimg()
{
    QString Imgfile;
    QString ImgfilePath;
    QImage Img;
    QImage guoqi;
    guoqi.load(":/image/guoqi.jpg");
    Imgfile = QFileDialog::getOpenFileName(this,"请选择图片","","image(*.jpg *.png *.bmp *.pgm *.pbm);");
    if(Imgfile != "")
    {

        if(Img.load(Imgfile))
        {
            QPixmap pixChina(":/image/guoqi.jpg");
            QImage newGuoqi = guoqi.scaled(Img.width(),Img.height());
            QImage imgOverlay = QImage(newGuoqi.size(), QImage::Format_ARGB32_Premultiplied);
            imgOverlay.fill(Qt::transparent);
            QPainter p1(&imgOverlay);
            p1.setCompositionMode(QPainter::CompositionMode_Source);
            p1.drawImage(0, 0, newGuoqi);
            p1.setCompositionMode(QPainter::CompositionMode_DestinationIn);
            p1.fillRect(newGuoqi.rect(), QColor(0, 0, 0, 200));
            p1.end();

            //QString style1  = " background: qradialgradient(cx:0, cy:0, radius: 1,fx:0.5, fy:0.5, stop:0 white, stop:1 green);" ;
            //ui->labelImg->setPixmap(QPixmap::fromImage(Img));
            QImage ImgResult = ImgOverlay(Img,imgOverlay);//叠加函数
            ImgResult.save("./china.png");
            QString ChinaFile = "./china.png";
            QString style  = "QWidget#labelImg{border-image:url("+ChinaFile+");}";
            ui->labelImg->setStyleSheet(style);

        }
    }
    QFileInfo ImgInfo;
    ImgInfo = QFileInfo(Imgfile);
    ImgfilePath = ImgInfo.filePath();
    ui->lineEdit->setText(ImgfilePath);
}


Widget::~Widget()
{
    delete ui;
}

QImage Widget::ImgOverlay(const QImage &bottomImg, const QImage &topImg)
{
    QImage imgOverlay = QImage(bottomImg.size(), QImage::Format_ARGB32_Premultiplied);
    QPainter painter(&imgOverlay);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(imgOverlay.rect(), Qt::transparent);
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawImage(0, 0, bottomImg);
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawImage(0, 0, topImg);
    painter.end();

    return imgOverlay;
}

void Widget::on_close_clicked()
{
    this->close();
}

主要代码讲解

通过区域填充更改图片透明度

//实现透明度改变
 p1.fillRect(newGuoqi.rect(), QColor(0, 0, 0, 200));

前面的参数为区域大小 ,后面QColor(0, 0, 0, 200) 前面三个就是我们所说的RGBA,最后一个参数为透明度,值为0-255
这里稍微进行下延申,若向要在显示窗口自己更改透明度,可以将Qlabel背景设置为我们想要调节透明度的图片,用控件关联Qlabel,在控件相应槽函数中用样式表进行透明度改变

background-color: rgba(0, 0, 0,a);

然后在其下层放一个相同大小的Qlabel进行叠加,用文中

QImage ImgResult = ImgOverlay(Img,imgOverlay);//叠加函数

进行叠加后在保存
对于文中设置图片合成模式效果

painter.setCompositionMode(QPainter::CompositionMode_Source);

可详见其他大佬的总结
https://blog.csdn.net/chduguxue/article/details/82902980

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值