將多張圖片無縫拼接方法


   Qt開發,最近在進行大圖片處理實驗,開了一個腦洞,試着將大圖片切碎,將每一個碎塊封裝到QImage中作為一個對象,然后將其打包

成一個二維數組,類似於google map 地圖顯示(其實是不想采用高斯金字塔那樣的空間,又想大道縮放自如),只能說形式是像,

本質上不同. 最后的結果不甚理想,讀取速度太慢了,但是卻學到了如何將多個圖片無縫隙的拼接到一起.

     對於image處理,Qt提供了這幾個Qimage,QReaderImage,QPixmap,QPainter.

如果我們需要在QWidget上顯示多張圖片,又不想中間有縫隙的話:

可以參考這種格式:

 

 1 void FuseImage::paintEvent(QPaintEvent *event){
 2 
 3     QPainter painter(this);
 4     QVector< QVector<QImage> >::iterator it;
 5     QVector< QImage >::iterator im;
 6     //有一個放大,縮小功能
 7     float sw = (1.*tt.t_size.width())/width();
 8     float sh = (1.*tt.t_size.height())/height();
 9     int px=0,py=0,tmph=0;
10 
11     for(it=tt.col.begin() ; it<tt.col.end() ; it++){
12         tmph=px=0;
13         for(im = it->begin() ; im<it->end() ; im++){
14             //平滑
15           QImage qtm(*im);
16           qtm=qtm.scaled(qtm.width()*1./sw,qtm.height()*1./sh,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
17           painter.drawPixmap(px,py,qtm.width(),qtm.height(),QPixmap::fromImage(qtm));
18           px+=qtm.width()+1;
19           tmph=qtm.height();
20         }
21       py+=tmph+1;
22     }
23 }

效果圖:

原始圖
如果要顯示原始圖效果只需要調整位置即可:
 1 void FuseImage::paintEvent(QPaintEvent *event){
 2 
 3     QPainter painter(this);
 4     QVector< QVector<QImage> >::iterator it;
 5     QVector< QImage >::iterator im;
 6     //有一個放大,縮小功能
 7     float sw = (1.*tt.t_size.width())/width();
 8     float sh = (1.*tt.t_size.height())/height();
 9     int px=0,py=0,tmph=0;
10 
11     for(it=tt.col.begin() ; it<tt.col.end() ; it++){
12         tmph=px=0;
13         for(im = it->begin() ; im<it->end() ; im++){
14             //平滑
15           QImage qtm(*im);
16           qtm=qtm.scaled(qtm.width()*1./sw,qtm.height()*1./sh,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
17           painter.drawPixmap(px,py,qtm.width(),qtm.height(),QPixmap::fromImage(qtm));
18           px+=qtm.width();
19           tmph=qtm.height();
20         }
21       py+=tmph;
22     }
23 }

效果圖:

整個過程代碼:

 1 #ifndef _IMAGEFUSE_HH
 2 #define _IMAGEFUSE_HH
 3 #pragma once
 4 #include<GroupImage.h>
 5 
 6 class FuseImage
 7     :public  QWidget
 8 {
 9 Q_OBJECT  
10 
11 public :
12  FuseImage();
13  void setfilename( QString filename );
14  virtual ~FuseImage();
15 protected:
16     virtual void paintEvent(QPaintEvent *event);
17 private:
18     GroupImage  tt;
19 };
20 
21 #endif //IMAGEFUSE_H
 1 #include<ImageFuse.h>
 2 #include<QPainter>
 3 FuseImage::FuseImage(){
 4 }
 5 
 6 FuseImage::~FuseImage(){
 7 }
 8 
 9 void FuseImage::setfilename(QString filename){
10 
11     tt.SetFilePath(filename);
12 }
13 
14 void FuseImage::paintEvent(QPaintEvent *event){
15 
16     QPainter painter(this);
17     QVector< QVector<QImage> >::iterator it;
18     QVector< QImage >::iterator im;
19     //有一個放大,縮小功能
20     float sw = (1.*tt.t_size.width())/width();
21     float sh = (1.*tt.t_size.height())/height();
22     int px=0,py=0,tmph=0;
23 
24     for(it=tt.col.begin() ; it<tt.col.end() ; it++){
25         tmph=px=0;
26         for(im = it->begin() ; im<it->end() ; im++){
27             //平滑
28           QImage qtm(*im);
29           qtm=qtm.scaled(qtm.width()*1./sw,qtm.height()*1./sh,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
30           painter.drawPixmap(px,py,qtm.width(),qtm.height(),QPixmap::fromImage(qtm));
31           px+=qtm.width();
32           tmph=qtm.height();
33         }
34       py+=tmph;
35     }
36 }

 參考: 高斯金字塔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM