将多张图片无缝拼接方法

摘要:
Qt开发,最近在进行大图片处理实验,开了一个脑洞,试着将大图片切碎,将每一个碎块封装到QImage中作为一个对象,然后将其打包成一个二维数组,类似于googlemap地图显示(其实是不想采用高斯金字塔那样的空间,又想大道缩放自如),只能说形式是像,本质上不同.最后的结果不甚理想,读取速度太慢了,但是却学到了如何将多个图片无缝隙的拼接到一起.对于image处理,Qt提供了这几个Qimage,QRea

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张将多张图片无缝拼接方法第2张原始图将多张图片无缝拼接方法第3张
如果要显示原始图效果只需要调整位置即可:
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 }

效果图:

将多张图片无缝拼接方法第4张

整个过程代码:

1 #ifndef _IMAGEFUSE_HH
2 #define _IMAGEFUSE_HH
3 #pragma once
4 #include<GroupImage.h>
5 
6 classFuseImage
7     :publicQWidget
8 {
9 Q_OBJECT  
10 
11 public:
12 FuseImage();
13  voidsetfilename( 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 voidFuseImage::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 }

参考: 高斯金字塔

免责声明:文章转载自《将多张图片无缝拼接方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Asp.net MVC Razor模板引擎技巧分享django之设置缓存下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

js批量下载文件

单个文件批量下载方法一:H5新特性HTML5里面为标签添加了一个download的属性,我们可以轻易的利用它来实现下载功能。download的属性值是可选的,它用来指定下载文件的文件名。1Downloadfile方法二:jsjs实现的思路是:1、添加标签用JavaScript创建一个隐藏的标签设置它的href属性设置它的download属性用JavaScri...

Ansible入门

自动操作和维护常识操作和维护工作系统安装物理机、虚拟机包安装、配置、服务启动批处理操作程序发布监控操作和维护级别OS配置物理机PXE、,Cobbler(选择多版本操作系统)虚拟机ImageTemplates配置木偶(ruby)saltstack(python)检查cfengine...

iOS开发(Swift):创建UINavigationView的三种方法

,表示window值我们会赋值。然后创建一个根视图控制器rootViewController,一个导航控制器navigationController。)-˃Bool{//Overridepointforcustomizationafterapplicationlaunch.window=UIWindowwindow.makeKeyAndVisible()ro...

MeteoInfo-Java解析与绘图教程(一)

MeteoInfo-Java解析与绘图教程(一)已经进入开发行业很多年了,这两年一直从事气象开发行业,为此对气象绘图有了新的见解像色斑图与卫星图一直都有python去绘制,在偶然的情况下,我接触到了meteoInfo,在对其使用过程中,也可以做到用java绘制格点散点图,色斑图,等值图,卫星图,风场图所以趁这个机会我开始记录自己的探索过程,方便你我他对于绘图...

MongoDB 查看集合的统计信息

--1查看集合的统计信息srs0:“size”:“ok”:可以理解为集合名称计数:集合中的文档总数大小:连续分配的数据块索引:最近分配的块的大小paddingFactor:所有索引索引的总大小大小:--2显示rs0:db。东西。stats(1024)(KB);{“ns”:“count”:“size”:“indexSize”:...

antd Tabs组件动态加载组件内容

Tabs的TabPane子组件不支持将属性传递给Component,并且官方示例的TabPane内容仅为简单文本。...