版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZhangXiaoyu_sy/article/details/79054657
主要代码
#include "imagecomposer.h"
#include "ui_imagecomposer.h"
static QString mode[35];
static const QSize resultSize(200,200);
ImageComposer::~ImageComposer()
{
delete ui;
}
void ImageComposer::paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.fillRect(rect(),Qt::white);
}
ImageComposer::ImageComposer(QWidget *parent) :
QWidget(parent),
ui(new Ui::ImageComposer)
{
ui->setupUi(this);
resultImage=QImage(resultSize,QImage::Format_ARGB32_Premultiplied);
ui->sourceLabel->setGeometry(10,10,200,200);
ui->destinationLabel->setGeometry(230,10,200,200);
ui->resultLabel->setGeometry(450,10,200,200);
loadImage(":/images/bf.jpg",&sourceImage,ui->sourceLabel);
loadImage(":/images/md.jpg",&destinationImage,ui->destinationLabel);
for(int i=0;i<35;i++)
{
mode[i]="none";
}
mode[QPainter::CompositionMode_SourceOver]="SourceOver";
mode[QPainter::CompositionMode_DestinationOver]="DestinationOver";
mode[QPainter::CompositionMode_Clear]="Clear";
mode[QPainter::CompositionMode_Source]="Source";
mode[QPainter::CompositionMode_Destination]="Destination";
mode[QPainter::CompositionMode_SourceIn]="SourceIn";
mode[QPainter::CompositionMode_DestinationIn]="DestinationIn";
mode[QPainter::CompositionMode_SourceOut]="SourceOut";
mode[QPainter::CompositionMode_DestinationOut]="Destination";
mode[QPainter::CompositionMode_SourceAtop]="SourceAtop";
mode[QPainter::CompositionMode_DestinationAtop]="DestinationAtop";
mode[QPainter::CompositionMode_Xor]="Xor";
mode[QPainter::CompositionMode_Plus]="Plus";
mode[QPainter::CompositionMode_Multiply]="Multiply";
mode[QPainter::CompositionMode_Screen]="Screen";
mode[QPainter::CompositionMode_Overlay]="Overlay";
mode[QPainter::CompositionMode_Darken]="Darken";
mode[QPainter::CompositionMode_Lighten]="Lighten";
mode[QPainter::CompositionMode_ColorBurn]="ColorBurn";
mode[QPainter::CompositionMode_HardLight]="HardLight";
mode[QPainter::CompositionMode_SoftLight]="SoftLight";
mode[QPainter::CompositionMode_Difference]="Difference";
mode[QPainter::CompositionMode_Exclusion]="Exclusion";
ui->groupBox->setGeometry(10,230,640,160);
QGridLayout *layout=new QGridLayout;
int count,x,y;
count=x=y=0;
for(int i=0;i<35;i++)
{
if(mode[i]!="none")
{
x=count%6; //列数
y=count/6; //行数
QRadioButton *radioButton=new QRadioButton(mode[i],this);
layout->addWidget(radioButton,y,x);
connect(radioButton,SIGNAL(clicked()),this,
SLOT(onModeRadioButtonClicked())); //共用一个槽函数
count++;
}
}
ui->groupBox->setLayout(layout);
resize(660,400);
}
void ImageComposer::onModeRadioButtonClicked()
{
QObject *object=QObject::sender();
QRadioButton *sender = qobject_cast<QRadioButton*>(object);//得到单选按钮上的文字
QPainter::CompositionMode currentMode=
(QPainter::CompositionMode)findMode(sender->text());
QPainter painter(&resultImage); //清理画布上的垃圾
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(resultImage.rect(),Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(0,0,destinationImage);
painter.setCompositionMode(currentMode);
painter.drawImage(0,0,sourceImage);
painter.end();
ui->resultLabel->setPixmap(QPixmap::fromImage(resultImage));
// QMessageBox::information(this,"Test",sender->text());
}
int ImageComposer::findMode(const QString &modeString) const
{
for(int i=0;i<35;i++)
{
if(mode[i] == modeString)
return i;
}
return -1;
}
void ImageComposer::loadImage(const QString fileName,QImage *image,QLabel *label)
{
image->load(fileName);
*image=image->scaled(resultSize,Qt::KeepAspectRatio); //等比例缩放
QImage fixImage(resultSize,QImage::Format_ARGB32_Premultiplied);
QPainter painter(&fixImage);
painter.setCompositionMode(QPainter::CompositionMode_Source); //设置复合模式
painter.fillRect(fixImage.rect(),Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(0,0,*image);
painter.end();
*image=fixImage;
label->setPixmap(QPixmap::fromImage(*image));
}
QPoint ImageComposer::imagePos(const QImage &image) const
{
return QPoint((resultSize.width()-image.width())/2,
(resultSize.height()-image.height())/2);
}
源代码链接:
点击打开链接