2016-05-17 1 views
0

У меня 2 изображения в 2 ярлыках (label_pic, label_pic_2), и я хотел бы объединить эти изображения (AND, OR, XOR), но я не знаю, как, я действительно новичок в платформе Qt, и я не хочу использовать OpneCV. Может кто-нибудь мне помочь?Qt Image Minging

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_RGB32 и QImage::Format_ARGB32. Для преобразования из других форматов используйте функцию QImage::convertToFormat() или примените вашу операцию по-разному.
Я могу добавить примерное решение также для 8-разрядных (проиндексированных) изображений, если необходимо.

Для простоты это также сводится к случаю с исходными изображениями одинакового размера.