前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >将多张图片无缝拼接方法

将多张图片无缝拼接方法

作者头像
Gxjun
发布2018-03-27 11:34:06
6.5K0
发布2018-03-27 11:34:06
举报
文章被收录于专栏:mlmlml

   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 }

 参考: 高斯金字塔

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-01-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档