将多张图片无缝拼接方法
2016-01-13 22:14
411 查看
Qt开发,最近在进行大图片处理实验,开了一个脑洞,试着将大图片切碎,将每一个碎块封装到QImage中作为一个对象,然后将其打包
成一个二维数组,类似于google map 地图显示(其实是不想采用高斯金字塔那样的空间,又想大道缩放自如),只能说形式是像,
本质上不同. 最后的结果不甚理想,读取速度太慢了,但是却学到了如何将多个图片无缝隙的拼接到一起.
对于image处理,Qt提供了这几个Qimage,QReaderImage,QPixmap,QPainter.
如果我们需要在QWidget上显示多张图片,又不想中间有缝隙的话:
可以参考这种格式:
效果图:
原始图
如果要显示原始图效果只需要调整位置即可:
效果图:
整个过程代码:
参考: 高斯金字塔
成一个二维数组,类似于google map 地图显示(其实是不想采用高斯金字塔那样的空间,又想大道缩放自如),只能说形式是像,
本质上不同. 最后的结果不甚理想,读取速度太慢了,但是却学到了如何将多个图片无缝隙的拼接到一起.
对于image处理,Qt提供了这几个Qimage,QReaderImage,QPixmap,QPainter.
如果我们需要在QWidget上显示多张图片,又不想中间有缝隙的话:
可以参考这种格式:
void FuseImage::paintEvent(QPaintEvent *event){ QPainter painter(this); QVector< QVector<QImage> >::iterator it; QVector< QImage >::iterator im; //有一个放大,缩小功能 float sw = (1.*tt.t_size.width())/width(); float sh = (1.*tt.t_size.height())/height(); int px=0,py=0,tmph=0; for(it=tt.col.begin() ; it<tt.col.end() ; it++){ tmph=px=0; for(im = it->begin() ; im<it->end() ; im++){ //平滑 QImage qtm(*im); qtm=qtm.scaled(qtm.width()*1./sw,qtm.height()*1./sh,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); painter.drawPixmap(px,py,qtm.width(),qtm.height(),QPixmap::fromImage(qtm)); px+=qtm.width()+1; tmph=qtm.height(); } py+=tmph+1; } }
效果图:
原始图
如果要显示原始图效果只需要调整位置即可:
void FuseImage::paintEvent(QPaintEvent *event){ QPainter painter(this); QVector< QVector<QImage> >::iterator it; QVector< QImage >::iterator im; //有一个放大,缩小功能 float sw = (1.*tt.t_size.width())/width(); float sh = (1.*tt.t_size.height())/height(); int px=0,py=0,tmph=0; for(it=tt.col.begin() ; it<tt.col.end() ; it++){ tmph=px=0; for(im = it->begin() ; im<it->end() ; im++){ //平滑 QImage qtm(*im); qtm=qtm.scaled(qtm.width()*1./sw,qtm.height()*1./sh,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); painter.drawPixmap(px,py,qtm.width(),qtm.height(),QPixmap::fromImage(qtm)); px+=qtm.width(); tmph=qtm.height(); } py+=tmph; } }
效果图:
整个过程代码:
#ifndef _IMAGEFUSE_HH #define _IMAGEFUSE_HH #pragma once #include<GroupImage.h> class FuseImage :public QWidget { Q_OBJECT public : FuseImage(); void setfilename( QString filename ); virtual ~FuseImage(); protected: virtual void paintEvent(QPaintEvent *event); private: GroupImage tt; }; #endif //IMAGEFUSE_H
#include<ImageFuse.h> #include<QPainter> FuseImage::FuseImage(){ } FuseImage::~FuseImage(){ } void FuseImage::setfilename(QString filename){ tt.SetFilePath(filename); } void FuseImage::paintEvent(QPaintEvent *event){ QPainter painter(this); QVector< QVector<QImage> >::iterator it; QVector< QImage >::iterator im; //有一个放大,缩小功能 float sw = (1.*tt.t_size.width())/width(); float sh = (1.*tt.t_size.height())/height(); int px=0,py=0,tmph=0; for(it=tt.col.begin() ; it<tt.col.end() ; it++){ tmph=px=0; for(im = it->begin() ; im<it->end() ; im++){ //平滑 QImage qtm(*im); qtm=qtm.scaled(qtm.width()*1./sw,qtm.height()*1./sh,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); painter.drawPixmap(px,py,qtm.width(),qtm.height(),QPixmap::fromImage(qtm)); px+=qtm.width(); tmph=qtm.height(); } py+=tmph; } }
参考: 高斯金字塔
相关文章推荐
- 流媒体学习之一些应该先了解的名词
- python核心编程-正则表达式之-边界匹配
- 动物按姓名排名
- 【C++primer】一学期阅读笔记
- WebKit之WebRTC初步认识
- Object-C数组和字典
- 阿里云ubuntu搭建SVN服务器
- 右键bitlocker消失
- 3.css制作面包屑
- Sorry,this application cannot run under a Virtual Machine
- 【夜读】杨澜:我可以接受失败,但不能接受没有尝试
- Java线程:概念与原理
- WebKit之WebRTC的研究
- SpringMVC响应Restful风格请求404
- Android--listView的divider分割线样式和边距
- myeclipse的配置
- CodeForces 609B.The Best Gift
- 主机字节序列和网络字节序列
- Android Studio 中使用Java 8 特性
- txt和lmdb训练caffenet设置对比