2016-05-17 94 views
0

我在2個標籤(label_pic,label_pic_2)中有2個圖像,我想合併這些圖像(AND,OR,XOR),但我不知道如何,我是Qt平臺的新手,我不想使用OpneCV。有人能幫助我嗎?Qt圖像合併

Here is my code: 

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

} 

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

void MainWindow::changeEvent(QEvent *e){ 
    QMainWindow::changeEvent(e); 
    switch (e->type()){ 
    case QEvent::LanguageChange: 
     ui->retranslateUi(this); 
     break; 
    default: 
     break; 
    } 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    //Opening picture file1: 

    QFileDialog dialog(this); 
    dialog.setNameFilter(tr("Images (*.png *.xmp *.jpg)")); 
    dialog.setViewMode(QFileDialog::Detail); 
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "C:/...", tr("Image Files (*.png *.jpg *.bmp")); 

    //Select other pictures from the folder: 

    if(!fileName.isEmpty()){ 
     QImage image (fileName); 
     ui->label_pic->setPixmap(QPixmap::fromImage(image)); 
    } 

} 

void MainWindow::on_pushButton_2_clicked() 
{ 
    //Opening picture file2: 

    QFileDialog dialog(this); 
    dialog.setNameFilter(tr("Images (*.png *.xmp *.jpg)")); 
    dialog.setViewMode(QFileDialog::Detail); 
    QString fileName2 = QFileDialog::getOpenFileName(this, tr("Open Image"), "C:/...", tr("Image Files (*.png *.jpg *.bmp")); 

    //Select other pictures from the folder: 

    if(!fileName2.isEmpty()){ 
     QImage image2(fileName2); 
     ui->label_pic_2->setPixmap(QPixmap::fromImage(image2)); 
    } 

} 



void MainWindow::on_pushButton_3_clicked() 
{ 

    QImage image1 = ui->label_pic->pixmap()->toImage(); 
    QImage image2 = ui->label_pic_2->pixmap()->toImage(); 

    QPainter painter1(&image1); 
    image1.scaled(300,300); 
    image2.scaled(300,300); 

    // QImage image3 = pixmapMerge(iamge1,image2); 



    //ui->label_pic_3->setPixmap(QPixmap::fromImage()); 
    /* 
    QPainter painter; 

    painter.drawImage(0, 0, image1); 
    painter.drawImage(300, 0, image2); 
    painter.end(); 
    */ 

}`enter code here` 


P.S: The rest of my includes could not be shown, I don't know why, you can add them to your answers as well. Thank you in advice for any answers! 
+0

而我沒有寫的是,我想將這些圖片合併到label_pic_3中,當然是按下按鈕。 –

回答

0

我會建議簡單地通過像素循環並應用操作:

QImage pixmapMerge(const QImage & a, const QImage & b) 
{ 
    if (a.size() != b.size() || 
     a.format() != b.format()) 
     return QImage(); 

    QImage result(a.size(), a.format()); 
    for (int r = 0; r < a.height(); r++) 
    { 
     for (int c = 0; c < a.width(); c++) 
     { 
      QRgb pixA = a.pixel(c, r); 
      QRgb pixB = b.pixel(c, r); 
      QRgb pixR = pixA & pixB; // operation AND 

      result.setPixel(c, r, pixR); 
     } 
    } 

    return result; 
} 

注:
此解決方案僅適用於格式QImage::Format_RGB32QImage::Format_ARGB32的圖像。要從其他格式轉換,請使用QImage::convertToFormat()功能,或以不同的方式應用您的操作。
如果需要,我還可以爲8位(索引)圖像添加示例解決方案。

爲簡單起見,它也被簡化爲相同大小的源圖像。