大佬可以直接绕路,我只是为了给和我一样的菜鸡一点启发,一开始我也很懵逼,完全不知道怎么下手。
通过搜索引擎找到的方式大致有两种:
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了