Qt加载图片(复合模式)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}

源代码链接: 点击打开链接

猜你喜欢

转载自blog.csdn.net/ZhangXiaoyu_sy/article/details/79054657