將多張圖片無縫拼接方法

   Qt開發,最近在進行大圖片處理實驗,開了一個腦洞,試着將大圖片切碎,將每個碎塊封裝到QImage中做爲一個對象,而後將其打包數組

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

本質上不一樣. 最後的結果不甚理想,讀取速度太慢了,可是卻學到了如何將多個圖片無縫隙的拼接到一塊兒.google

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

若是咱們須要在QWidget上顯示多張圖片,又不想中間有縫隙的話:3d

能夠參考這種格式:code

 

 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 }

效果圖:orm

原始圖
若是要顯示原始圖效果只須要調整位置便可:
 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 }

效果圖:對象

整個過程代碼:blog

 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 }

 參考: 高斯金字塔圖片

相關文章
相關標籤/搜索