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