将多张图片无缝拼接方法
时间:2022-05-06
本文章向大家介绍将多张图片无缝拼接方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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 }
参考: 高斯金字塔
- 性能优化总结(四):预加载的设计
- 在Expression Blend中使用XAML建立3D应用程序
- 使用 Asp.net Future May 2007 开发Silverlight应用
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
- RePractise前端篇: 前端演进史
- 性能优化总结(三):聚合SQL在GIX4中的应用
- ASP.NET AJAX 控件开发基础
- 听我说说我的博客: 月访问量过万的个人IT博客的技术史
- TransactionScope和Enterprise Libray 3.0 Data Access Application Block
- 《Python Web开发 - 测试驱动方法》阅后感
- 微信小程序分享——会话服务器和业务服务器合并
- 微信官方开源UI库-WeUI
- ViewFlipper实现多页面切换
- Ubuntu & Fedora Mono 2.8 安装脚本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Day20:包含min函数的栈
- No module named ‘SerialClient‘和Cannot import package : rosserial_arduino
- 提升开发效率N倍的20+命令行神器!(附 demo)
- Java反射原理
- 【每日一题】46. Permutations
- 免费下论文的10个方法
- 【原创】90%的人都不会做的一道笔试题
- 这10道 Spring 常见面试题,你能搞定吗?
- 网工小白升级打怪篇(二)telnet实现远程管理
- (32)条件判断
- (33)if、case语句
- (34)for循环
- (35)while循环与until循环
- 你知道Java 8 的方法引用吗
- Spring Boot 配置文件的加载优先级总结