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 }
參考: 高斯金字塔圖片