完整版IDL入门教程七下.docx
- 文档编号:11808067
- 上传时间:2023-04-02
- 格式:DOCX
- 页数:12
- 大小:159.99KB
完整版IDL入门教程七下.docx
《完整版IDL入门教程七下.docx》由会员分享,可在线阅读,更多相关《完整版IDL入门教程七下.docx(12页珍藏版)》请在冰豆网上搜索。
完整版IDL入门教程七下
解决方法:
在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=!
D.Name
IDL>image=LoadData(7)
IDL>Set_Plot,‘PS’
IDL>Device,XSize=2,Ysize=2,/Inches,/Encapsulated
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,0.1,0.1,/Normal
IDL>Plot,FindGen(100),/NoData,/NoErase,$
Position=[0.1,0.1,0.9,0.9]
如果当前图形窗口为显示设备时,可以看到图72所示的输出。
图72:
在显示设备上带边框的图像。
但如果在PostScript设备上运行这些命令(不是用Window命令),将得到非常不一样的结果。
尤其是,图像根据输出窗口尺寸改变大小,很可能导致图像的外框的位置不对,如图73。
解决方法:
使用TV命令设置图像大小
设置将进入PostScript输出中的图像尺寸的正确方法是在TV命令中使用的XSize和YSize关键字。
例如,要在PostScript输出中得到与图72具有相同输出的正确方法如下:
IDL>thisDevice=!
D.Name
IDL>Set_Plot,‘PS’
IDL>Device,XSize=3.5,Ysize=3.5,/Inches,/Encapsulated
IDL>TV,image,0.525,0.25,XSize=2.8,Ysize=2.0,/Inches
IDL>Plot,FindGen(100),/NoData,/NoErase,$
Position=[0.15,0.10,0.95,0.90]
IDL>Device,/Close_File
IDL>Set_Plot,thisDevice
图73:
在PostScript输出中,图像的尺寸是根据输出窗口的尺寸来决定的,这可能并非用户想要的,如本图所示。
图74:
在PostScript窗口中,缩放和放置图像的正确方法是利用TV命令的缩放和
定位的能力。
将此图与图73比较一下。
如果想编写一个通用的IDL程序,就象上面这个,无论窗口大小如何变化都能正常工作,无论是在显示设备上还是在PostScript文件中,也同样能工作。
这时候,也许需要计算图像在显示窗口中基于设备坐标的大小和位置。
在PostScript设备上和在显示设备上工作时,唯一的真正区别在于如何计算图像的尺寸。
程序imageax.pro就是用于此目的(此程序在下载的本书配套程序中)。
PROImageAx,image,Position=position
IFN_PARAMS()EQ0THENMessage,'Mustpassimageargument.'
IFN_ELEMENTS(position)EQ0THEN$
position=[0.2,0.2,0.8,0.8]
;Getthesizeoftheimageinpixelunits.
s=SIZE(image)
imgXsize=s
(1)
imgYsize=s
(2)
;Calculatethesizeandstartinglocationsinpixels.
xsize=(position
(2)-position(0))*!
D.X_VSize
ysize=(position(3)-position
(1))*!
D.Y_VSize
xstart=position(0)*!
D.X_VSize
ystart=position
(1)*!
D.Y_VSize
;SizetheimagedifferentlyinPostScript.
IF!
D.NAMEEQ'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=3.5,YSize=2.5,/Inches,/Encapsulated
IDL>ImageAx,image,Position=[0.15,0.15,0.95,0.95]
IDL>Device,/Close_File
输出结果见图75。
想以完全独立于设备的方式来显示图像,笔者偏爱用TVImage程序(已下载的本书配套程序)。
它不仅能用Position关键字按上面ImageAx的风格来在显示窗口中定位图像,同时如果愿意,还能保持图像的纵横比。
关于TVImage命令详见72页的“用归一化坐标定位图像”。
IDL>Window,XSize=600,YSize=400,/Free
IDL>TVImage,image,Position=[0.15,0.15,0.95,0.95],$
/Keep_Aspect_Ratio
图75:
在3.5*3.5英寸的输出窗口中运ImageAx程序。
注意,图像的纵横比不再保持了,尽管保留了其在窗口中的位置。
在PostScript中显示图像的另一个极其重要的地方是,缺省情况下,PostScript设备对每个图像像素只保留四位的信息。
这对16色或是灰度级的图像已经足够了。
如果想要256色,应该将关键字Bits_Per_Pixel设为8,像这样:
IDL>Set_Plot,‘PS’
IDL>Device,Bits_Per_Pixel=8,Color=1
在横向输出模式中计算PostScript的偏移量
纵向模式下的PostScript文件偏移量为X方向上0.75英寸,y方向上5英寸。
这就将图形输出到页面的上半部分。
因此,非常容易就看出偏移量是基于页面的左下角计算出来。
(见图78。
)键入下列语句就可以看出缺省的偏移量:
图76:
纵向和横向模式下窗口的尺寸和偏移量。
注意,在横向模式下,整个页面被旋转了90度,并且偏移量(不是窗口尺寸)也随着一起旋转。
IDL>thisDevice=!
D.Name
IDL>Set_Plot,‘PS’
IDL>Help,/Device
IDL>Set_Plot,thisDevice
然而当把图像横向输出为时,整页已被旋转了90度,包括页面的左下角!
可以在图76中看到它们的缺省值。
如果没有意识到偏移点已随页面旋转了,可能设置的偏移量会使图形超出页面。
例如,想要使X和Y方向的偏移量都为1英寸,可以会这样做:
Set_Plot,‘PS’
Device,XOffset=1.0,YOffset=1.0,/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=!
D.Name
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的程序。
配置和使用打印设备
打印设备在IDL5.0中被引入介绍,最初不像其它图形输出设备能用Device命令来配置。
Dialog_PrinterSetup命令是用来存取计算机上缺省打印机的配置参数。
解释默认打印机如何安装和配置已经远远超出了本书要讨论的范围,但一般来说,打印机配置对话框提供了较多配置打印机自身的选项,但对于如何定位图形输出的选择相对较少。
比如说,PostScript设备。
为了让用户在打印设备上有更多的选项来松定位图形输出,ResearchSystems公司在IDL5.1.1中为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主程序一样。
将文件存为sendprinter.pro。
可以在下载的程序中找到这个程序。
data=LoadData
(1)
ok=Dialog_PrinterSetup()
IFokTHENBEGIN
thisDevice=!
D.Name
Set_Plot,'PRINTER'
Plot,data
Device,/Close_Document
Set_Plot,thisDevice
ENDIF
END
如果想运行这个主程序并且把结果输出到默认打印机上,可以这样做:
IDL>.Runsendprinter
用打印设备定位图形
在Printer设备的第一版中,当将图形输出到默认打印机时,输出的图形常常充满了整页纸,常常看起来什么根本不象显示设备上的图形。
实际上,不能控制将图形放在打印机的什么位置。
例如,图像按设备精度打印时,其左下角位于页面的左下角。
一个256乘256的图像用600dpi的像素分辨率打印到一个PostScript打印机上时,经常只有0.5平方英寸,除非应用了合适的比例放大因子。
像素在PostScript设备上,不会按比例地缩放到纸上。
TV或TVscl命令中的XSize和YSize关键字当它们用于PostScript时同样不能缩放像素。
(例子见71页的“在PostScript设备上改变图像尺寸”)
这一点在IDL5.1.1种作了改进,对Device命令增加了关键字,可以和Printer设备一起被用来定位图形在纸上的位置和比例。
像在PostScript设备中的同名关键字一样,Printer设备的关键字默认时用厘米单位。
(也可以设为英寸,如果Inches关键字被使用的话。
)
在纵向输出模式下,XSize,YSize,XOffset和YOffset的默认值是(用英寸):
XOffset:
0.75inches
YOffset:
5.0inches
XSize:
7.0inches
YSize:
5.0inches
在横向输出模式中,默认值为:
XOffset:
0.75inches
YOffset:
0.75inches
XSize:
9.5inches
YSize:
7.0inches
读者立即会发现这些缺省值在Printer设备上和在PostScript设备上给出了相同的相对输出尺寸。
但是也要注意,偏移量常常从页面的左下角计算出来。
这是显而易见的,但是横向模式下PostScript偏移量不是这样计算的(见199页的“在横向输出模式中计算PostScript的偏移量”)。
就意味着在编写一个既能创建PostScript文件又能将图形显示直接送到打印机的程序时,要格外注意横向模式下的偏移量。
为了帮助读者正确地计算这些关键字的值,ResearchSystems公司同时为Device命令引入了Get_Page_Size关键字,它可以用来返回一个包含打印设备页面的X方向尺寸和Y方向尺寸的两维矢量。
奇怪的是,只能用设备坐标返回页面的尺寸,尽管页面和偏移量的关键词是用英寸或厘米来表示。
因此,要想在页面上获得精确的输出结果,必须做些计算。
例如,如果想让一个图形在输出时占页面的80%,也可以键入这些命令:
IDL>thisDevice=!
D.Name
IDL>Set_Plot,‘PRINTER’
IDL>Device,Get_Page_Size=myPage
IDL>Device,XSize=myPage[0]*0.8,XOffset=myPage[0]*0.1,$
YSize=myPage[1]*0.8,YOffset=myPage[1]*0.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=!
D.Name
IDL>Set_Plot,‘PRINTER’
IDL>Device,XOffset=1.25,YOffset=3.5,/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 入门教程