Qt 实现遥感图像显示时的连动效果
遥感图像处理时少不了ENVI,用过ENVI的人都知道,打开图像时或图像处理完后,在缩略图上移动鼠标时,鼠标周围的图像信息会在大的视图中实时的显示,即大图会跟着小图中的鼠标移动,这即是图像的连动效果。如下图是ENVI的示意图:
在软件设计中,要实现类似ENVI中连动的效果,确实要费一番脑筋。
要求:有两幅图,一个是缩略图,一个是原图或处理后的图,使用两个对话框,鼠标在小的缩略图中移动或点击时,大图中的图像实时显示出鼠标所在位置的图像。
结果展示:首先给出结果展示,这样读者也好明白实现这样的功能入手点和重点在那些地方。
从上图中可以看出:1.大图在移动时其实只需要控制滑动杆的位置即可,控制滑动杆的位置即设置水平和垂直两个滑动轴的值大小;
2.需要检测出鼠标在缩略图中的滑动和点击事件
再联系到使用QT实现时,可以使用信号与槽将这两者联系起来,两幅图对应两个对话框,使用两个类分别实现对话框的功能。鼠标在缩略图中点击或移动时,实时记录鼠标所在位置,并触发信号,大图的槽函数响应缩略图对话框发过来的信号,设置滑动轴的值。
坐标值与滑动轴值之间的联系:需要确定鼠标在缩略图中的位置,x长度占缩略图宽度的百分比,y长度占缩略图长度的百分比,然后这两个值传递给大图对话框的类对象,根据这两个百分比和大图图像的宽和高设置滑动杆的值。
缩略图对话框类为SmallImage,大图对话框类为ImgShow
首先是在SmallImage类中重写鼠标事件,缩略图图像显示区大小固定为300*300
//smallimage.h
#ifndef SMALLIMAGE_H
#define SMALLIMAGE_H #include <QWidget>
#include <QMouseEvent>
#include "ui_smallimage.h" class SmallImage : public QWidget
{
Q_OBJECT public:
SmallImage(QWidget *parent = );
~SmallImage(); void show_small_img(float *data,int width,int height);//显示缩略图图像 float x_value;//鼠标点所在位置占x轴的百分比
float y_value;//鼠标点所在位置占y轴的百分比 signals:
void press(float x,float y); private:
Ui::SmallImage ui; void mousePressEvent(QMouseEvent *ev);//重写鼠标按下事件
void mouseMoveEvent(QMouseEvent *ev);//重写鼠标移动事件 int img_width_;//缩略图宽
int img_height_;//缩略图高 }; #endif // SMALLIMAGE_H //smallimage.cpp
//重写鼠标按下事件
void SmallImage::mousePressEvent(QMouseEvent *ev)
{
int x1=ui.label->x();//x坐标
int y1=ui.label->y();//y坐标
int x_left=x1+(-img_width_)/;//缩略图左起x坐标
int x_right=x1+img_width_+(-img_width_)/;//缩略图右边的x坐标
int y_top=y1+(-img_height_)/;//缩略图上起y坐标
int y_bottom=y1+img_height_+(-img_height_)/;//缩略图底部y坐标
int x0=ev->x();
int y0=ev->y();
if ( (x0>=x_left) && (x0<=x_right) && (y0>=y_top) && (y0<=y_bottom))
{
x_value=(float)(x0-x_left)/(float)img_width_;
y_value=(float)(y0-y_top)/(float)img_height_;
//触发鼠标按下信号
emit press(x_value,y_value);
}
} //鼠标移动操作
void SmallImage::mouseMoveEvent(QMouseEvent *ev)
{
int x1=ui.label->x();//x坐标
int y1=ui.label->y();//y坐标
int x_left=x1+(-img_width_)/;//缩略图左起x坐标
int x_right=x1+img_width_+(-img_width_)/;//缩略图右边的x坐标
int y_top=y1+(-img_height_)/;//缩略图上起y坐标
int y_bottom=y1+img_height_+(-img_height_)/;//缩略图底部y坐标
int x0=ev->x();
int y0=ev->y();
if ( (x0>=x_left) && (x0<=x_right) && (y0>=y_top) && (y0<=y_bottom))
{
x_value=(float)(x0-x_left)/(float)img_width_;
y_value=(float)(y0-y_top)/(float)img_height_;
emit press(x_value,y_value);
}
}
然后是在ImgShow类中定义槽函数
//imgshow.h
public slots:
void set_scroll_value(float x0,float y0);//设置滑动杆的值 //imgshow.cpp
//设置滑动杆的值
void ImgShow::set_scroll_value(float x0, float y0)
{
ui.scrollArea->horizontalScrollBar()->setValue(x0*img_width_- (ui.scrollArea->width())/);
ui.scrollArea->verticalScrollBar()->setValue(y0*img_height_- (ui.scrollArea->height())/);
}
最后是当着两个对话框均显示出来之后将他们的信号与槽连接起来。
connect(small_img,SIGNAL(press(float,float)),img_show,SLOT(set_scroll_value(float,float)))
还有相当重要的一点就是,两个对话框必须都是非模态,关于非模态的内容请见:http://blog.csdn.net/luo_klt/article/details/8826975
本文中忽略了图像读取及显示等操作,在本人博客中的其他文章中有详细叙述,详见:
http://www.cnblogs.com/Romi/archive/2012/03/14/2396627.html
http://www.cnblogs.com/Romi/archive/2012/03/14/2396533.html
http://www.cnblogs.com/Romi/archive/2012/03/29/2424073.html
最后说一下,此文论述的方法是通过移动滑动杆(即改变滑动杆的值)来实现图像连动的,该文中的大图是显示的全部图像而非区域图像。
当只需要对区域进行处理而非全部图像时,这时上述方法便不起作用了,这时有一个简单的方法是固定选取鼠标在缩略图中周围的一小块数据,将它全部处理然后显示在大图上,每当鼠标移动或点击时都进行选取区域处理然后显示的执行过程。因为固定选取的是一小块区域因此处理起来速度也快。
倘若不是上面说的两种情况而是选取一块感兴趣区域时,这时就更加麻烦了,但回头一想,选择感兴趣区域区域大还好区域小的话,连动还有什么意义呢,况且选择的都不会是大的区域。有一个办法是先把选择的区域通过第三方软件截下来,然后使用文中的方法对截下来保存的图像数据进行处理并显示。
Qt 实现遥感图像显示时的连动效果的更多相关文章
- 转载利用伪元素单个颜色实现 hover 和 active 时的明暗变化效果
1.颜色小tip知识 在背景色上方叠加一个黑色半透明层 rgba(0,0,0,.2) 可以得到一个更暗的颜色 在背景色上方叠加一个白色半透明层 rgba(255,255,255,.2) 可以得到一个更 ...
- js简单实现删除记录时的提示效果
删除记录时的提示效果,挺人性化的,实现的方法有很多,在本文为大家介绍下使用js是如何实现的 样式 复制代码代码如下: <style type="text/css"> ...
- 设置Activity显示和关闭时的动画效果
设置Activity显示和关闭时的动画效果 通过overridePendingTransition方法可以设置Activity显示和关闭的动画效果.首先需要在res/anim目录中建立相应的动画资源文 ...
- ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力。
ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力. 1.http://www.yangqq.com/jstt/css3/2017-08-08/787. ...
- Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)
记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...
- Qt for android运行时出错 Error: Target id 'android--1' is not valid
[提问]windows7下Qt for android运行时出错 Error: Target id 'android--1' is not valid[复制链接] 上一主题下一主题 离线yijun ...
- VUE - 路由跳转时设置动画效果
/* 为对应的路由跳转时设置动画效果 */ <transition name="fade"> <router-view /> & ...
- CSS实现页面切换时的滑动效果
最近在开发手机端APP页面功能时遇到一个需求:某个页面查询的数据有三种分类,需要展示在同一页面上,用户通过点击分类标签来查看不同类型的数据, 期望效果是 用户点击标签切换时另一个页面能够以一个平滑切入 ...
- (原创)[C#] 一步一步自定义拖拽(Drag&Drop)时的鼠标效果:(一)基本原理及基本实现
一.前言 拖拽(Drag&Drop),属于是极其常用的基础功能. 无论是在系统上.应用上.还是在网页上,拖拽随处可见.同时拖拽时的鼠标效果也很漂亮,像这样: 这样: 还有这样: 等等等等. 这 ...
随机推荐
- three.js 之旅 (五)--跟场景scene相关的函数
1.scene.add(obj); 在场景中添加物体 2.scene.remove(obj); 在场景中移除物体 3.scene.children(); 获取场景中所有子对象的列表 4.sc ...
- 【实战】初识ListView及提高效率
简介: ListView是手机上最常用的控件之一,几乎所有的程序都会用到,手机屏幕空间有限,当需要显示大量数据的时候,就需要借助ListView来实现,允许用户通过手指上下滑动的方式将屏幕外的数据滚动 ...
- poj 3613 经过k条边最短路 floyd+矩阵快速幂
http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...
- curl 命令
看了篇文章: http://www.thegeekstuff.com/2012/04/curl-examples/ 如下: curl支持的协议有:DICT, FILE, FTP, FTPS, Goph ...
- jsp连接sqlServer数据库教程
一.首先讲下我用的工具版本以供参考: jar包:jtds1.3.1.jar 下载地址:点击进入 数据库:SQL Server2012 服务器:Tomcat8.0 下载地址:点击进入 开发IDE工 ...
- 开源IP代理池续——整体重构
开源IP代理池 继上一篇开源项目IPProxys的使用之后,大家在github,我的公众号和博客上提出了很多建议.经过两周时间的努力,基本完成了开源IP代理池IPProxyPool的重构任务,业余时间 ...
- 仿SiteMap实现Asp.net 网站的菜单和权限管理
在Asp.net中,SiteMap用于站点导航,可以与Menu等控件一起使用实现网站的菜单和权限管理.但是SiteMap提供的方法都是只读的,无法再运行时修改(菜单)导航文件,需要手动修改配置web. ...
- WPF快速入门系列(2)——深入解析依赖属性
一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...
- Kali Linux Web 渗透测试视频教程— 第二课 google hack 实战
Kali Linux Web 渗透测试— 第二课 代理简介 文/玄魂 课程地址: http://edu.51cto.com/course/course_id-1887.html 目录 shellKal ...
- MVC3不能正确识别JSON中的Enum枚举值
一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...