IDL如何编写一个对象图形系统(5)

2018-12-27 16:37

;reference it with a pointer .

pstate = ptr_new(state, /no_copy)

;Store a pointer to the state structure as the user value of ;the top level base widget.

widget_control , tlb , set_uvalue=pstate

定义一个状态结构体来存储组件程序数据。注意到这里也存储了原图像的一份拷贝,这样就有一个新的可用图像拷贝了。用指针指向图像和其拷贝,因为程序初始化时它们的维数都是未知的而在程序运行中又有可能会发生变化。为了在组件程序中访问组件状态数据,将状态结构体存为一个指针堆变量并将指针引用保存在顶层基底的用户值中。 jpegview

;Call the \ ; information in the pointer to the state structure . jpegview_dodisplay , pstate

下面将定义“do”例程JPEGVIEW_DODISPLAY,调用它即可在绘制组件中显示图像。 最后,调用XMANAGER进行对组件程序的事件处理。 jpegview

; Call XMANAGER in non blocking mode . xmanager, ' jpegview ', tlb , /no_block , $ event_handler='jpegview_resize' , $ cleanup=' jpegview_cleanup' end

这里新用到了XMANAGER的几个关键字。NO_BLOCK关键字使XMANAGER在非模块化模式下运行,这就允许用户在组件程序运行时访问IDL命令行。将EVENT_HANDLER关键字设置为一个字符串,该字符串给定了顶层基底事件处理例程名,本例中是JPEGVIEW_RESIEZE。将CLEANUP关键字设置为一个字符串,该字符串给定了组件程序终结时调用的例程,本例中是JPEGVIEW_CLEANUP。

“do”例程

“do”例程JPEGVIEW_DODISPLAY的任务是更新图像显示。 jpegview dodisplay

pro jpegview_dodispiay , pstate

; Ensure that the draw widget is set to be the current ; graphics widow . wset , ( *pstate).win_id

; Display the image

tv , * ( *pstate ) . image , true=( *pstate ).is_truecolor end

此“do”例程的任务是根据图像是索引模式还是分解模式在绘制组件中显示图像。应用程序在8位或更低位的显示系统中运行时,存储在状态结构体中的图像已由READ_JPEG例程量化了,TRUE关键字应设为0。若一开始就读入了8位的索引模式图像,TRUE关键字也应设置为0;否则应设为1以显示分解模式的24位图像。

21

清除例程(cleanup)

终结组件程序时XMANAGER将调用清除例程,它只有一个参数,就是顶层基底的组件标识。

jpegview cleanup

pro jpegview_cleanup, tlb

; Retrieve the user value of the tlb-- it's the pointer to the ; state structure.

Widget_control , tlb , get_uvalue=pstate

;Reset the original IDL color mode and color table, if necessary. device, decomposed=( * pstate) . odec if (* pstate) . odec eq 0 then $

tvlct , ( *pstate ) .r , ( *pstate) .g, (*pstate) .b

;Clean up the pointer references .

ptr_free , (*pstate) .image , (*pstate).imageccpy , pstate end

调用清除例程有两个目的:1)清除程序中所有用过的堆变量;2)将IDL颜色模式和颜色表重置到初始状态。注意到组件程序退出前用PTR_FREE清除了组件程序中定义的所有指针,因此结束程序后就无需再调用HEAP_FREE和HEAP_GC了。

改变尺寸事件处理器

JPEGVIEW的最后一个部分是改变尺寸事件处理器。改变尺寸事件发生时,此事件管理器必须确定顶层基底的新尺寸,修改图像数据,改变绘制组件的尺寸并调用“do”例程显示图像。

jpegview resize

pro jpegview_resize , event

; Retrieve the user value of the tlb - it's the pointer to the ;state structure .

widget_control , event.top , get_uvalue=pstate

;Use WIDGET INFO to get geometry information about the new size ;of the top level base .

tlbg = widget_info( event.top , /geometry)

; Set the new size of the image ( and the draw widget ) by ;subtracting the padding from the tlb . newx = event .x - tlbg .xpad newy = event .y - tlbg .ypad

; Resize the image using CONGRID.

*(*pstate) . image = (*pstate ) . is_truecolor $

22

? congrid (* (*pstate) . imagecopy , 3 , newx, newy , /interp) $ : congird (* (*pstate) . imagecopy , newx , newy )

; Set new draw widget size

widget_control, (*pstate). draw, xsize= newx, ysize= newy

; Call the \

jpegview_dodispaly , pstate end

在此例程中,确定了顶层基底的新几何结构,扣除填充部分为图像创建新的X和Y尺寸,然后用CONGRID改变图像尺寸。绘制组件的尺寸也发生了变化且通过调用“do”例程在其内显示图像。这与组件几何结构中所用方法类似,只是在这里图像大小也需改动以适应绘图窗口的新尺寸。

注意:在JPEGVIEW_RESIZE中为CONGRID设置了INTERP关键字来修改分解模式图像而非索引模式图像的大小。这是为什么呢?

测试程序

打开example/data子目录下的rose.jpg文件来测试JPEGVIEW。图5-4显示了该图的原始尺寸227×149象素;图5-5显示了经过放到调整的图像。

图5-4

23

图5-5

小提示:在www.dfanning.com上有许多免费的小程序,其中包括David Fanning开发了一款出色的改变图像窗口尺寸的小程序。

24

第六章:图像处理器

简介:

图像实际上是由二维数据点数组组成的图画,其中各数据点被称为象素。各象素值代表着图像在该象素位置的亮度和颜色。基于电脑创建和显示颜色的方法,每个象素都有一个值或是一组值,其值范围一般是在0到255之间。

图像是展示科学数据和医学数据的一种常用格式。近年来发展了大量用于分析、增强图像或从图像中提取信息的技术。IDL通过其内置的例程库可执行一系列范围很广的处理技术。用IDL也可开发一系列其他的图像过滤和处理技术。本章中我们将建立一个组件程序,用它显示图像并执行一些基本的图像处理例程。

规划一个图像处理组件程序

我们从描述其功能开始规划这个组件程序。简单的说,此程序应能做到: ·加载一幅图像,通过传入应用程序的方式或是直接从文件中读取。 ·显示图像。 ·处理图像。

·将处理后的图像保存到文件中或传回到IDL。

上述列表中的各项为创建一个简单但十分有用的图像处理应用程序给出了方向,可以考虑继续为此表添加内容。

可采取好几种方法将标准格式图像(如BMP,JPEG,PICT,PNG,TIFF)读入IDL。最常用的两种是READ_IMAGE和DIALOG_READ_IMAGE例程。在此组件程序中我们采用DIALOG_READ_IMAGE,因为它有一个十分好用的用户界面。 显示图像的任务由一个绘制组件来完成。但是图像的大小会很不同,所以我们必须要确定绘制组件的尺寸是依照图像尺寸变化呢,还是固定其尺寸而通过滚动条来浏览整幅图像。这两种方式在IDL中都是可行的。前者用到了一个可变大小的顶层基底组件,前两章中建立的PLOTINTERACTIVE组件程序就采用了这种方法。在这里为了展示使用滚动条的便捷性,我们选用后一种方法。

对图像处理也需要先做计划。IDL有哪些可用的图像处理例程?又应选用哪些呢? IDL初级手册中的“图像处理”章节对这些图像处理功能做了简单介绍。为了简单起见,本例中只采用应用于空间域的图像处理程序,避开了用于频率域的相关程序。 最后是此组件程序的名字:IMAGEPROCESSOR(图像处理器)

组件创建模块

我们现在已经有足够信息来创建组件程序IMAGEPROCESSOR了。从组件创建模块开始,打开一个新文件,命名为imageprocessor.pro,然后输入下述代码: imageprocessor

pro imageprocessor,image,processed=pimage compile_opt idl2

此过程有一个位置参数和一个可选的关键字参数。位置参数image是一个从调用程序传入的关于图像数据的二维字节型数组。关键字PROCESSED是一个输出参数,若将某IDL变量赋值给它,处理后的图像就会通过局部变量pimage传回调用程序。

COMPILE_OPT指令用于为IDL编译器提供附加信息。IDL2选项将缺省时的整型常量设置为32位(长型)而非16位(短型)。它还强制要求对数组下标使用方括号而非圆括号。

25


IDL如何编写一个对象图形系统(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:给水排水管网系统期末考试复习资料整理(完整版)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: