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),属于是极其常用的基础功能. 无论是在系统上.应用上.还是在网页上,拖拽随处可见.同时拖拽时的鼠标效果也很漂亮,像这样: 这样: 还有这样: 等等等等. 这 ...
随机推荐
- 使用VPN服务器解决公司不能上淘宝的问题
很多公司为了保证员工的效率,通常采用屏蔽端口的方法屏蔽掉了一些网站,比如淘宝.QQ网页版等,这样做虽然也是公司的迫不得已,但是也有点不人性化,毕竟非上班时间也是上不去此类网站的.前些日子电商大站,抢不 ...
- memcache的一致性hash算法使用
一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的k ...
- iOS多线程编程之NSThread的使用(转)
本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation ...
- Linux下运行jar包
方法① 1.vim xxx.jar 2.配置程序入口:找到MANIFEST.MF,添加Main-Class:+空格+package.class 3.引入第三方jar包:①在MANIFEST.MF中加入 ...
- APUE1
[APUE]进程控制(上) 一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是in ...
- 毫无保留开源我写的:IOS Android Ipad 多点触摸通用js 库
毫无保留开源我写的:IOS Android Ipad 多点触摸通用js 库 在线演示地址: http://m.yunxunmi.com/ 支持 IOS Android Ipad 等不同操作系统的手持或 ...
- C#分布式缓存二:Asp.Net中使用Couchbase
前言 上一篇<C#分布式缓存一:Couchbase的安装与简单使用>主要讲解对Couchbase服务端的安装配置和客户端的引用调用,通过代码来完成最简单的实现调用.本次通过简单的配置,来完 ...
- 安卓系统上安装.net运行时 mono runtime
感谢以下博主: ubuntu指南 http://dawndiy.com/archives/229/ img大小调整 http://zebinj.blog.163.com/blog/static/206 ...
- django CSRF token missing or incorrect
django 异步请求时提示403 按照一般情况权限问题,python文件没有问题,仔细看了下response里有一句 CSRF token missing or incorrect.这个肯定是因为安 ...
- 大熊君说说JS与设计模式之------代理模式Proxy
一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...