QT中實現拼接兩張圖片,尺寸不同或者相同

大佬可以直接繞路,我只是爲了給和我一樣的菜雞一點啓發,一開始我也很懵逼,完全不知道怎麼下手。

通過搜索引擎找到的方式大致有兩種:

     1.採用OpenCV直接調用相關函數進行拼接:參考鏈接

     2.採用QT本身圖片操作相關的類(本文章採用的方式):思路參考

解決本問題的主題思想就是:用QPixmap創建一個大圖,將兩幅圖片用Qpainter畫到大圖上

代碼如下:

//main.cpp

#include "MainWindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
//MainWindow .h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void displayImage();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 

//MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QPainter>

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

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

void MainWindow::displayImage()
{
    QImage img1;
    img1.load("C:/Users/Pictures/Camera Roll/1.jpg");
    int img1width = img1.width();
    int img1height = img1.height();
    QImage img2;
    img2.load("C:/Users/Desktop/2.jpg");
    int img2width = img2.width();
    int img2height = img2.height();

    int newImageWidth = img1width + img2width;
    int newImageHeight = img1height > img2height ?  img1height : img2height;

    ui->label->setGeometry(0, 0, newImageWidth, newImageHeight); 

    QPixmap newImage(newImageWidth, newImageHeight);   //1.創建大圖(使用QImage類也可以)
    QPainter p(&newImage);

    p.fillRect(newImage.rect(), QBrush("#e8eae9"));    //空白區域顏色填充
    
    //2.繪製兩幅小圖到QPixmap上
    QRect imgRect1(0, 0, img1.width(), img1.height());
    p.drawImage(imgRect1, img1);
    QRect imgRect2(img1.width(), 0, img2.width(), img2.height());
    p.drawImage(imgRect2, img2);

    QPixmap image = newImage.scaled(1280, 1080, Qt::KeepAspectRatio);   //控制縮放比例,因爲label顯示有大小限制

    ui->label->clear();     //清空緩存區,否則會導致第二次加載同一張圖片不會顯示,詳細百度有說
    ui->label->setPixmap(image);   //3.方便起見,直接採用label顯示
}

正確運行截圖如下:

運行結果 

自己一開始沒有進行縮放,一張圖片過大,會導致圖片顯示不全:解決參考鏈接

沒有進行縮放的圖片

有什麼問題歡迎歡迎指正,代碼風格可能不是很優美,希望我把思想說明白了。

也可以繼續拼接多張圖片,我自己嘗試了三張,更高深的圖片操作,可能就需要使用opencv了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章