首页 > 其他 > 详细

将多张图片无缝拼接方法

时间:2016-01-13 23:37:31      阅读:368      评论:0      收藏:0      [点我收藏+]

   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 }

 参考: 高斯金字塔

将多张图片无缝拼接方法

原文:http://www.cnblogs.com/gongxijun/p/5127163.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!