遥感图像处理时少不了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 实现遥感图像显示时的连动效果的更多相关文章

  1. 转载利用伪元素单个颜色实现 hover 和 active 时的明暗变化效果

    1.颜色小tip知识 在背景色上方叠加一个黑色半透明层 rgba(0,0,0,.2) 可以得到一个更暗的颜色 在背景色上方叠加一个白色半透明层 rgba(255,255,255,.2) 可以得到一个更 ...

  2. js简单实现删除记录时的提示效果

    删除记录时的提示效果,挺人性化的,实现的方法有很多,在本文为大家介绍下使用js是如何实现的 样式 复制代码代码如下: <style type="text/css">  ...

  3. 设置Activity显示和关闭时的动画效果

    设置Activity显示和关闭时的动画效果 通过overridePendingTransition方法可以设置Activity显示和关闭的动画效果.首先需要在res/anim目录中建立相应的动画资源文 ...

  4. ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力。

    ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力. 1.http://www.yangqq.com/jstt/css3/2017-08-08/787. ...

  5. Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

    记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...

  6. Qt for android运行时出错 Error: Target id 'android--1' is not valid

    [提问]windows7下Qt for android运行时出错 Error: Target id 'android--1' is not valid[复制链接] 上一主题下一主题   离线yijun ...

  7. VUE - 路由跳转时设置动画效果

    /* 为对应的路由跳转时设置动画效果 */   <transition name="fade">         <router-view />     & ...

  8. CSS实现页面切换时的滑动效果

    最近在开发手机端APP页面功能时遇到一个需求:某个页面查询的数据有三种分类,需要展示在同一页面上,用户通过点击分类标签来查看不同类型的数据, 期望效果是 用户点击标签切换时另一个页面能够以一个平滑切入 ...

  9. (原创)[C#] 一步一步自定义拖拽(Drag&Drop)时的鼠标效果:(一)基本原理及基本实现

    一.前言 拖拽(Drag&Drop),属于是极其常用的基础功能. 无论是在系统上.应用上.还是在网页上,拖拽随处可见.同时拖拽时的鼠标效果也很漂亮,像这样: 这样: 还有这样: 等等等等. 这 ...

随机推荐

  1. treeMap and treeSet

    TreeSet:如果要对对象进行排序,对象类要实现Comparable接口! TreeMap:如果要对对象进行排序,对象类要实现Comparable接口! 下面是我自己写的小程序主要传输对象 publ ...

  2. Android 6.0 新功能及主要 API 变更

    运行时权限 这个版本中引入了新的权限模型,现在用户可以在运行时直接管理应用程序的权限.这个模型基于用户对权限控制的更多可见性,同时为应用程序的开发者提供更流畅的应用安装和自动升级.用户可以为已安装的每 ...

  3. fancybox iframe 刷新父页面(项目经验)

    <script type="text/javascript"> $(document).ready(function() { $(".fancybox&quo ...

  4. js 操作map对象

    转自:http://smallvq123.javaeye.com/blog/823923 /* * Map对象,实现Map功能 * * * size() 获取Map元素个数 * isEmpty() 判 ...

  5. javascript 中的console.log和弹出窗口alert

    主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...

  6. 捉BUG记(To Catch a Bug)

    大约有一年整没有写一篇博客了,由于各种原(jia)因(ban)导致闲暇时间要么拿着IPad看岛国奇怪的片(dong)子(hua).要么拿着kindle看各种各样的资(xiao)料(shuo).本来想写 ...

  7. Win2012R2的一个Bug---安装群集后可能引发的软件崩溃问题及相应补丁

    如标题,笔者查阅资料发现微软声称安装故障转角色后就可能发生上述描述问题,但不止于SSMS崩溃.建议使用win2012R2的朋友安装补丁. 笔者在部署win2012R2+Sql2014 cluster时 ...

  8. [Xamarin] 用Service 來製作一個Notification的時鐘 (转帖)

    這篇利用來製作一個會出現在Notification的時鐘,來敘述一下 Service,在你製作的App被關閉時,可以透過Service繼續運行你想處理的部分,當然Service 也有其生命周期 接下來 ...

  9. ArcMap 连接SDE 出错“Failed to connect to the specified server. Entry for SDE instance no found in services file.”

    问题描述 环境: ARCMAP 10.0 ARCSDE FOR ORACLE 10.0   在通过用ArcMap 连接ORACLE SDE时出现上面的错.   解决方式 在 C:\Windows\Sy ...

  10. 理解 Soap

    http://www.cnblogs.com/yhuang/archive/2012/04/04/share_storm.html 自己也写了下: using System; using System ...