IDL入门教程7下.docx
- 文档编号:7040636
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:12
- 大小:159.81KB
IDL入门教程7下.docx
《IDL入门教程7下.docx》由会员分享,可在线阅读,更多相关《IDL入门教程7下.docx(12页珍藏版)》请在冰豆网上搜索。
IDL入门教程7下
解决方式:
在PostScript输出中确保恰本地缩放数据
那个问题能够用两种方式来解决。
第一,一旦将PostScript设备设置为当前图形设备时,能够从头装载色彩表。
或,确保将图像数据缩放到显示设备所能取得的颜色范围内。
从头装载色彩表将使显示设备上的输出与PostScript输看上去几乎一样。
为了使输出完全一样(固然,是在各类颜色发生技术的约束条件下),有必要将数据缩放到显示设备所能取得的颜色数量范围内。
若是色彩表和数据一样,输出也将一样。
(关于正确缩放数据参见66页的“缩放图像数据”。
)
注意,在缺省情形下,在PostScript图像中每一个图像像素只保留四位信息。
这意味着,即便PostScript设备能够显示256色,但在输出图像中将只能看到16色。
若是想看到全数256色,必需贮存8位的像素信息。
能够用Bits_Per_Pixel关键字在Device命令中设置,如下:
Device,Bits_Per_Pixel=8,Color=1
问题:
PostScript设备显示图像时的不同
显示设备与PostScript设备的另外一个不同点是显示图像时的区别。
尤其是,显示设备具有固定尺寸的像素,而PostScript设备具有可变的像素尺寸。
换句话说,在PostScript中一个像素事实上能够是任意矩形尺寸。
这会阻碍图像输出到PostScript文件中的方式.
PostScript设备依照PostScript画图窗口的尺寸和图像的纵横比来决定图像的大小。
例如,若是PostScript的画图窗口为2*2英寸,而且要输出的图像为360*360像素(如何保证?
),那么一个简单的TV命令就能够输出2*2英寸的PostScript图像:
IDL>thisDevice=!
IDL>image=LoadData(7)注释:
image是字节型的大小为360*360的数组
IDL>Set_Plot,‘PS’
IDL>Device,XSize=2,Ysize=2,/Inches,/Encapsulated注释:
/Encapsulated生成封装的PostScript文件输出
IDL>PlotS,[0,1,1,0,0],[0,0,1,1,0],/Normal
IDL>TV,image
IDL>Device,/Close_File
IDL>Set_Plot,thisDevice
上述命令产生的输出如图69所示。
图69:
PostScript设备用可变的像素来使图像适应输出窗口的尺寸。
那个地址的尺寸为2*2英寸。
但是,若是输出窗口尺寸与原图像的纵横比不同时,图像将改变尺寸以保证自身的纵横比,其中有一方向将完全填满输出窗口。
例如,一样利用上述图像,那个地址的输出窗口为X方向1英寸,Y方向2英寸。
IDL>Set_Plot,‘PS’
IDL>Device,XSize=1,Ysize=2,/Inches,/Encapsulated
IDL>PlotS,[0,1,1,0,0],[0,0,1,1,0],/Normal
IDL>TV,image
IDL>Device,/Close_File
这些命令取得的结果见图70。
注意,此图像只有1*1英寸,只填充了输出窗口的一半。
图70:
当输出窗口和原图像具有不同的纵横比时,图像将改变尺寸以维持自身的纵横比,而且其中的一个方向将充满整个输出窗口。
类似地,若是有一个2*1英寸的输出窗口,如下:
IDL>Set_Plot,‘PS’
IDL>Device,XSize=2,Ysize=1,/Inches,/Encapsulated
IDL>PlotS,[0,1,1,0,0],[0,0,1,1,0],/Normal
IDL>TV,image
IDL>Device,/Close_File
结果见图71。
图71:
此图类似于图70,除输出窗口的X方向是Y方向的两倍外。
若是PostScript画图窗口是X方向1英寸和Y方向3英寸,那么TV命令输出的结果是1*1英寸的图像。
事实上,图像老是依照输出窗口的尺寸和原图像的纵横比来确信大小,可能会造成困难。
例如,假设有一个500*500像素的显示窗口,而且想将图像显示在400*400像素大小的窗口的中心。
更进一步假设,要在图像的周围画一外框。
可能会用以下命令在窗口中定位显示图像:
IDL>image=LoadData(7)
IDL>image=Congrid(image,400,400,/Interp)
IDL>Window,XSize=500,Ysize=500
IDL>TV,image,,,/Normal
IDL>Plot,FindGen(100),/NoData,/NoErase,$
Position=[,,,]注释:
画外框
若是当前图形窗口为显示设备时,能够看到图72所示的输出。
图72:
在显示设备上带边框的图像。
但如果是在PostScript设备上运行这些命令(不是用Window命令),将取得超级不一样的结果。
尤其是,图像依照输出窗口尺寸改变大小,极可能致使图像的外框的位置不对,如图73。
解决方式:
利用TV命令设置图像大小
设置将进入PostScript输出中的图像尺寸的正确方式是在TV命令中利用的XSize和YSize关键字。
例如,要在PostScript输出中取得与图72具有相同输出的正确方式如下:
IDL>thisDevice=!
IDL>Set_Plot,‘PS’
IDL>Device,XSize=,Ysize=,/Inches,/Encapsulated
IDL>TV,image,,,XSize=,Ysize=,/Inches
IDL>Plot,FindGen(100),/NoData,/NoErase,$
Position=[,,,]
IDL>Device,/Close_File
IDL>Set_Plot,thisDevice
图73:
在PostScript输出中,图像的尺寸是依照输出窗口的尺寸来决定的,这可能并非用户想要的,如本图所示
。
图74:
在PostScript窗口中,缩放和放置图像的正确方式是利用TV命令的缩放和
定位的能力。
将此图与图73比较一下。
若是想编写一个通用的IDL程序,就象上面那个,不管窗口大小如何转变都能正常工作,不管是在显示设备上仍是在PostScript文件中,也一样能工作。
这时,或许需要计算图像在显示窗口中基于设备坐标的大小和位置。
在PostScript设备上和在显示设备上工作时,唯一的真正区别在于如何计算图像的尺寸。
程序确实是用于此目的(此程序在下载的本书配套程序中)。
PROImageAx,image,Position=position
IFN_PARAMS()EQ0THENMessage,'Mustpassimageargument.'
IFN_ELEMENTS(position)EQ0THEN$
position=[,,,]
;Getthesizeoftheimageinpixelunits.
s=SIZE(image)
imgXsize=s
(1)
imgYsize=s
(2)
;Calculatethesizeandstartinglocationsinpixels.
xsize=(position
(2)-position(0))*!
ysize=(position(3)-position
(1))*!
xstart=position(0)*!
ystart=position
(1)*!
;SizetheimagedifferentlyinPostScript.
IF!
EQ'PS'THEN$
TV,image,xstart,ystart,XSize=xsize,YSize=ysizeELSE$
TV,Congrid(image,xsize,ysize,/Interp),xstart,ystart
;Drawtheaxesaroundtheimage.
Plot,FIndGen(100),/NoData,/NoErase,Position=position
END
打开几个不同尺寸的窗口运行该程序,输出依次显示在每一个窗口中。
注意,图像的纵横比再也不维持了。
反而,它在窗口的位置维持不变。
IDL>image=LoadData(9)
IDL>Window,XSize=400,YSize=400,/Free
IDL>ImageAx,image
IDL>Window,XSize=300,YSize=500,/Free
IDL>ImageAx,image
IDL>Window,XSize=600,YSize=300,/Free
IDL>ImageAx,image
能够运行那个程序,将输出结果传送到任何窗口,不管是显示设备仍是PostScript设备都能够。
例如,能够用下面的命令将输出送到PostScript文件中。
IDL>Set_Plot,‘PS’
IDL>Device,XSize=,YSize=,/Inches,/Encapsulated
IDL>ImageAx,image,Position=[,,,]
IDL>Device,/Close_File
输出结果见图75。
想以完全独立于设备的方式来显示图像,笔者偏爱用TVImage程序(已下载的本书配套程序)。
它不仅能用Position关键字按上面ImageAx的风格来在显示窗口中定位图像,同时若是情愿,还能维持图像的纵横比。
关于TVImage命令详见72页的“用归一化坐标定位图像”。
IDL>Window,XSize=600,YSize=400,/Free
IDL>TVImage,image,Position=[,,,],$
/Keep_Aspect_Ratio
图75:
在*英寸的输出窗口中运ImageAx程序。
注意,图像的纵横比再也不维持了,尽管保留了其在窗口中的位置。
在PostScript中显示图像的另一个极为重要的地址是,缺省情形下,PostScript设备对每一个图像像素只保留四位的信息。
这对16色或是灰度级的图像已经足够了。
若是想要256色,应该将关键字Bits_Per_Pixel设为8,像如此:
IDL>Set_Plot,‘PS’
IDL>Device,Bits_Per_Pixel=8,Color=1
在横向输出模式中计算PostScript的偏移量
纵向模式下的PostScript文件偏移量为X方向上英寸,y方向上5英寸。
这就将图形输出到页面的上半部份。
因此,超级容易就看出偏移量是基于页面的左下角计算出来。
(见图78。
)键入以下语句就能够够看出缺省的偏移量:
图76:
纵向和横向模式下窗口的尺寸和偏移量。
注意,在横向模式下,整个页面被逆时针旋转了90度,而且偏移量(不是窗口尺寸)也随着一路旋转。
(右图有问题吧?
)
IDL>thisDevice=!
IDL>Set_Plot,‘PS’
IDL>Help,/Device
IDL>Set_Plot,thisDevice
但是当把图像横向输出为时,整页已被旋转了90度,包括页面的左下角!
能够在图76中看到它们的缺省值。
若是没成心识到偏移点已随页面旋转了,可能设置的偏移量会使图形超出页面。
例如,想要使X和Y方向的偏移量都为1英寸,能够会如此做:
Set_Plot,‘PS’
Device,XOffset=,YOffset=,/Inches,/Landscape
Plot,data
能够在图77中看到想象中作出的图形和事实上作出的图。
确信自己明白了偏移量在横向模式下是如何工作的。
图77:
若是不注意横向模式下偏移量是如何工作的,图形将被旋转偏出页面右边。
最右边的图不是如此的吧?
用PS_Form配置PostScript设备
已下载的本书配套程序中有一个名为PS_Form的程序。
那个程序的目的是让用户能够交互式地决定将图形放在PostScript输出窗口的哪里,和设置PostScript设备其它的配置。
能够在图78中看到PS_Form的图示说明。
在右上角的画图组件内的黄色方框代表PostScript页面。
黄色框内的绿色框是PostScript页面上输出窗口的位置。
用鼠标左键沿在页面内移动绿色方框。
用鼠标右键画一个新的绿色框。
当设置好以后,点Accept按钮。
PS_From将返回一个结构,此结构里面的字段都是Device命令的有效关键字。
如下PS_Form被用来画一个简单图形的例子。
deviceKeywords=PS_Form(Cancel=canceled)
IfcanceledNE1THENBegin
currentDevice=!
Set_Plot,‘PS’
Device,_Extra=deviceKeywords
Plot,LoadData
(1)
Device,/Close_File
Set_Plot,currentDevice
ENDIF
注意PS_Form的一个好特点是,当设备被设置为横向时,用户没必要考虑偏移量的旋转问题。
对用户来讲,偏移量仿佛老是基于左下角算出来的。
PS_Form另一个好特点是,它能够记住上次设置。
例如,像下面如此挪用PS_Form,并更改它的配置。
终止以后点Accept按钮。
IDL>setup=PS_Form()
要看设置的内容,键入:
IDL>Help,setup,/Structure
要用适才的设置内容来启动PS_Form,键入:
IDL>newSetup=PS_Form(Defaults=setup)
要看PS_Form是如何被应用的,能够试着挪用XWindow程序,它也是下载的本书配套程序之一。
XWindow是一个“智能化”的图形窗口,它能够自我调整大小,能够载入只用于它自己的色彩表,也能够将它的输出送到PostScript文件中。
能够如此来挪用它:
IDL>XWindow,‘Shade_surf’,LoadData
(2),/Output,/XColors
尝试用XWindow程序将窗口里面的内容制作成一个PostScript文件。
这本书余下的大部份内容将讨论如何编写一个类似于Xwindows的程序。
配置和利用打印设备
打印设备在中被引入介绍,最初不像其它图形输出设备能用Device命令来配置。
Dialog_PrinterSetup命令是用来存取运算机上缺省打印机的配置参数。
说明默许打印机如何安装和配置已经远远超出了本书要讨论的范围,但一样来讲,打印机配置对话框提供了较多配置打印机自身的选项,但关于如何定位图形输出的选择相对较少。
比如说,PostScript设备。
为了让用户在打印设备上有更多的选项来松定位图形输出,ResearchSystems公司在IDL5中为Printer设备引入了Device关键字。
(注意,这些关键字仅适用于当向打印机发送直接图形命令时。
)这些关键字XSize,YSize,XOffset和YOffset和其它硬拷贝输出设备中同名关键字很象,尽管不完满是。
下面将指出它们的一些不同的地方。
图78:
弹出式组件程序PS_Form。
那个程序为用户配置PostScript设备提供了交互式方式。
此图为如何配置PostScript设备来生本钱书的大部份图形。
要存取默许打印机的配置,键入:
IDL>ok=Dialog_PrinterSetup()
此对话框在WindowsNT上如图79所示。
图79:
在WindowsNT机械上的Dialog_PrinterSetup的对话框
在利用打印设备时,重要的是要明白,只有关键字Close_Document被用于Device命令时,输出内容才会被送到打印机上。
例如,生成一幅线画图命令的正确顺序类似于下面的代码。
关闭打印机文档是必需的。
若是忘了这条代码,可不能输出任何东西。
由于下面的代码中有一个IF循环,因此下面的代码必需放在一个文本编辑器中编辑,就像一个IDL主程序一样。
将文件存为。
能够在下载的程序中找到那个程序。
data=LoadData
(1)
ok=Dialog_PrinterSetup()
IFokTHENBEGIN
thisDevice=!
Set_Plot,'PRINTER'
Plot,data
Device,/Close_Document
Set_Plot,thisDevice
ENDIF
END
若是想运行那个主程序而且把结果输出到默许打印机上,能够如此做:
IDL>.Runsendprinter
用打印设备定位图形
在Printer设备的第一版中,当将图形输出到默许打印机时,输出的图形常常充满了整页纸,常常看起来什么全然不象显示设备上的图形。
事实上,不能操纵将图形放在打印机的什么位置。
例如,图像按设备精度打印时,其左下角位于页面的左下角。
一个256乘256的图像用600dpi的像素分辨率打印到一个PostScript打印机上时,常常只有平方英寸,除非应用了适合的比例放大因子。
像素在PostScript设备上,可不能按比例地缩放到纸上。
TV或TVscl命令中的XSize和YSize关键字当它们用于PostScript时一样不能缩放像素。
(例子见71页的“在PostScript设备上改变图像尺寸”)
这一点在IDL5种作了改良,对Device命令增加了关键字,能够和Printer设备一路被用来定位图形在纸上的位置和比例。
像在PostScript设备中的同名关键字一样,Printer设备的关键字默许时用厘米单位。
(也能够设为英寸,若是Inches关键字被利用的话。
)
在纵向输出模式下,XSize,YSize,XOffset和YOffset的默许值是(用英寸):
XOffset:
inches
YOffset:
inches
XSize:
inches
YSize:
inches
在横向输出模式中,默许值为:
XOffset:
inches
YOffset:
inches
XSize:
inches
YSize:
inches
读者当即会发觉这些缺省值在Printer设备上和在PostScript设备上给出了相同的相对输出尺寸。
可是也要注意,偏移量常常从页面的左下角计算出来。
这是显而易见的,可是横向模式下PostScript偏移量不是如此计算的(见199页的“在横向输出模式中计算PostScript的偏移量”)。
就意味着在编写一个既能创建PostScript文件又能将图形显示直接送到打印机的程序时,要额外注意横向模式下的偏移量。
为了帮忙读者正确地计算这些关键字的值,ResearchSystems公司同时为Device命令引入了Get_Page_Size关键字,它能够用来返回一个包括打印设备页面的X方向尺寸和Y方向尺寸的两维矢量。
奇怪的是,只能用设备坐标返回页面的尺寸,尽管页面和偏移量的关键词是用英寸或厘米来表示。
因此,要想在页面上取得精准的输出结果,必需做些计算。
例如,若是想让一个图形在输出时占页面的80%,也能够键入这些命令:
IDL>thisDevice=!
IDL>Set_Plot,‘PRINTER’
IDL>Device,Get_Page_Size=myPage
IDL>Device,XSize=myPage[0]*,XOffset=myPage[0]*,$
YSize=myPage[1]*,YOffset=myPage[1]*,/Device
IDL>Plot,Findgen(11)
IDL>Device,/Close_Document
IDL>Set_Plot,thisDevice
用打印设备输出图像
向Printer设备输出一张图像稍不同于PS设备向PostScript文件输出一张图像(见193页的“问题:
PostScript设备显示图像时的不同”。
)要紧区别在于通过Printer设备输出的图像没有维持纵横比,而用PostScript设备输出时却保留了。
可是,和PostScript设备一样,Printer设备也能在TV或TVScl命令顶用XSize,YSize关键字来适当的改变图像的尺寸。
图像的偏移量能够用Device命令中的关键字Xoffset,YOffset关键字来设置。
例如,假假想在页面的中间放一个常规的图像,在页面上的纵横比为2/3,能够键入下面这些命令:
IDL>thisDevice=!
IDL>Set_Plot,‘PRINTER’
IDL>Device,XOffset=,YOffset=,/Inches
IDL>image=LoadData(7)
IDL>TV,image,XSize=6,YSize=4,/Inches
IDL>Device,/Close_Document
IDL>Set_Plot,thisDevice
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IDL 入门教程
![提示](https://static.bdocx.com/images/bang_tan.gif)