您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 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图像:IDLthisDevice=!D.NameIDLimage=LoadData(7)IDLSet_Plot,‘PS’IDLDevice,XSize=2,Ysize=2,/Inches,/EncapsulatedIDLPlotS,[0,1,1,0,0],[0,0,1,1,0],/NormalIDLTV,imageIDLDevice,/Close_FileIDLSet_Plot,thisDevice上述命令产生的输出如图69所示。图69:PostScript设备用可变的像素来使图像适应输出窗口的尺寸。这里的尺寸为2*2英寸。然而,如果输出窗口尺寸与原图像的纵横比不同时,图像将改变尺寸以保证自身的纵横比,其中有一方向将完全填满输出窗口。例如,同样使用上述图像,这里的输出窗口为X方向1英寸,Y方向2英寸。IDLSet_Plot,‘PS’IDLDevice,XSize=1,Ysize=2,/Inches,/EncapsulatedIDLPlotS,[0,1,1,0,0],[0,0,1,1,0],/NormalIDLTV,imageIDLDevice,/Close_File这些命令得到的结果见图70。注意,此图像只有1*1英寸,只填充了输出窗口的一半。图70:当输出窗口和原图像具有不同的纵横比时,图像将改变尺寸以维持自身的纵横比,并且其中的一个方向将充满整个输出窗口。类似地,如果有一个2*1英寸的输出窗口,如下:IDLSet_Plot,‘PS’IDLDevice,XSize=2,Ysize=1,/Inches,/EncapsulatedIDLPlotS,[0,1,1,0,0],[0,0,1,1,0],/NormalIDLTV,imageIDLDevice,/Close_File结果见图71。图71:此图类似于图70,除了输出窗口的X方向是Y方向的两倍外。如果PostScript绘图窗口是X方向1英寸和Y方向3英寸,那么TV命令输出的结果是1*1英寸的图像。事实上,图像总是根据输出窗口的尺寸以及原图像的纵横比来确定大小可能会造成困难。例如,假设有一个500*500像素的显示窗口,并且想将图像显示在400*400像素大小的窗口的中心。更进一步假设,要在图像的周围画一外框。可能会用以下命令在窗口中定位显示图像:IDLimage=LoadData(7)IDLimage=Congrid(image,400,400,/Interp)IDLWindow,XSize=500,Ysize=500IDLTV,image,0.1,0.1,/NormalIDLPlot,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具有相同输出的正确方法如下:IDLthisDevice=!D.NameIDLSet_Plot,‘PS’IDLDevice,XSize=3.5,Ysize=3.5,/Inches,/EncapsulatedIDLTV,image,0.525,0.25,XSize=2.8,Ysize=2.0,/InchesIDLPlot,FindGen(100),/NoData,/NoErase,$Position=[0.15,0.10,0.95,0.90]IDLDevice,/Close_FileIDLSet_Plot,thisDevice图73:在PostScript输出中,图像的尺寸是根据输出窗口的尺寸来决定的,这可能并非用户想要的,如本图所示。图74:在PostScript窗口中,缩放和放置图像的正确方法是利用TV命令的缩放和定位的能力。将此图与图73比较一下。如果想编写一个通用的IDL程序,就象上面这个,无论窗口大小如何变化都能正常工作,无论是在显示设备上还是在PostScript文件中,也同样能工作。这时候,也许需要计算图像在显示窗口中基于设备坐标的大小和位置。在PostScript设备上和在显示设备上工作时,唯一的真正区别在于如何计算图像的尺寸。程序imageax.pro就是用于此目的(此程序在下载的本书配套程序中)。PROImageAx,image,Position=positionIFN_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_VSizeysize=(position(3)-position(1))*!D.Y_VSizexstart=position(0)*!D.X_VSizeystart=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=positionEND打开几个不同尺寸的窗口运行该程序,输出依次显示在每一个窗口中。注意,图像的纵横比不再保持了。反而,它在窗口的位置保持不变。IDLimage=LoadData(9)IDLWindow,XSize=400,YSize=400,/FreeIDLImageAx,imageIDLWindow,XSize=300,YSize=500,/FreeIDLImageAx,imageIDLWindow,XSize=600,YSize=300,/FreeIDLImageAx,image可以运行这个程序,将输出结果传送到任何窗口,无论是显示设备还是PostScript设备都可以。例如,可以用下面的命令将输出送到PostScript文件中。IDLSet_Plot,‘PS’IDLDevice,XSize=3.5,YSize=2.5,/Inches,/EncapsulatedIDLImageAx,image,Position=[0.15,0.15,0.95,0.95]IDLDevice,/Close_File输出结果见图75。想以完全独立于设备的方式来显示图像,笔者偏爱用TVImage程序(已下载的本书配套程序)。它不仅能用Position关键字按上面ImageAx的风格来在显示窗口中定位图像,同时如果愿意,还能保持图像的纵横比。关于TVImage命令详见72页的“用归一化坐标定位图像”。IDLWindow,XSize=600,YSize=400,/FreeIDLTVImage,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,像这样:IDLSet_Plot,‘PS’IDLDevice,Bits_Per_Pixel=8,Color=1在横向输出模式中计算PostScript的偏移量纵向模式下的PostScript文件偏移量为X方向上0.75英寸,y方向上5英寸。这就将图形输出到页面的上半部分。因此,非常容易就看出偏移量是基于页面的左下角计算出来。(见图78。)键入下列语句就可以看出缺省的偏移量:图76:纵向和横向模式下窗口的尺寸和偏移量。注意,在横向模式下,整个页面被旋转了90度,并且偏移量(不是窗口尺寸)也随着一起旋转。IDLthisDevice=!D.NameIDLSet_Plot,‘PS’IDLHelp,/DeviceIDLSet_Plot,thisDevice然而当把图像横向输出为时,整页已被旋转了90度,包括页面的左下角!可以在图76中看到它们的缺省值。如果没有意识到偏移点已随页面旋转了,可能设置的偏移量会使图形超出页面。例如,想要使X和Y方向的偏移量都为1英寸,可以会这样做:Set_Plot,‘PS’Device,XOffset=1.0,YOffset=1.0,/Inches,/LandscapePlot,data可以在图77中看到想象中作出的图形和实际上作出的图。确信自己明白了偏移量在横向模式下是怎样工作的。图77:如果不注意横向模式下偏移量是怎样工作的,图形将被旋转偏出页面右边。用PS_Form配置PostScript设备已下载的本书配套程序中有一个名为PS_Form的程序。这个程序的目的是让用户能够交互式地决定将图形放在PostScript输出窗口的哪里,以及设置PostScript设备其它的配置。可以在图78中看到PS_Form的图示说明。在右上角的绘图组件内的黄色方框代表PostScript页面。黄色框内的绿色框是PostScript页面上输出窗口的位置。用鼠标左键沿在页面内移
本文标题:IDL入门教程七(下)
链接地址:https://www.777doc.com/doc-2876978 .html