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了

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