您的位置:首页 > 其它

将多张图片无缝拼接方法

2016-01-13 22:14 411 查看
Qt开发,最近在进行大图片处理实验,开了一个脑洞,试着将大图片切碎,将每一个碎块封装到QImage中作为一个对象,然后将其打包

成一个二维数组,类似于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;
}
}


参考: 高斯金字塔
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: