IDL入门教程七(上)

发布时间:2018-07-02 12:34:44   来源:文档文库   
字号:

第七章 图形硬拷贝输出

本章概要

在使用IDL的时候,如何以硬拷贝形式再现屏幕中的图形是最复杂,也是最难理解的问题。然而,这是大多数献身科学的人的需求,但很少有令人完全满意的方法来和同事共享科学结果。

本章将集中于PostScript输出,因为PostScript是普遍接收的一种输出媒介,大部分使用IDL的程序员都能使用PostScript打印机。所有关于PostScript的内容同样适用于其它输出设备,比如HP绘图仪和PCL打印机。

具体来说,将学习:

1. 如何选择硬拷贝输出设备

2. 如何配置硬拷贝输出设备

3. 如何将图形输出直接传送到打印机

4. 如何将图形输出传送到一个文件中

5. 如何为硬拷贝输出设备产生图形输出

6. PostScript输出与显示器的输出有什么不同

7. 如何在PostScript页面上定位图形和图像

8. 如何产生能包含在其它文档中的图形输出

9. 如何编写能很容易地转化为硬拷贝输出的程序

10. 如何在PostScript种使用颜色

选择图形硬拷贝输出设备

与设置其它图形显示设备一样,在IDL中,仍然使用Set_plot命令来设置图形硬拷贝输出设备:

Set_Plot, 'option'

其中的option是下列的任何一种,注意option总是一个字符串,因此要使用单引号括起来。与IDL其它大多数字符串不一样,option对大小写不敏感。

CGM 输出写入CGM(计算机图形元文件)格式的文件中,CGM也是一种独立于设备的文件格式,用于交换图形信息。CGM文件能以三种形式之一编码:(1)文本,(2)二进制数据,(3NCAR二进制数据。

HP 输出以惠普图形语言(HP-GL)格式写入一个文件,它适用于各种各样的HP-GL笔式绘图仪。

PCL 输出以惠普打印机控制语言(PCL)格式写入一个文件,它适用于各式激光和喷墨打印机。

PRINTER 输出以任何适合于默认打印机的方式直接传送到该打印机。

PS 输出以PostScript格式写入一个文件中。

Z 输出被写入Z图形缓冲区。

在打印完毕后,应再次使用Set_plot命令将输出设备改回为图形显示设备的类型,以下是一些常用的显示设备:

WIN 使用微软WindowsNT操作系统的个人计算机。

MAC 使用MacOS操作系统的计算机

X 使用X Window系统的计算机。

只有一种设备能成为当前图形设备,可以通过检查!D.Name系统变量来确定当前的设备是哪种,如下:

IDL>Print,!D.Name

注意,当设定设备名时,设备名对大小写不敏感,但当在代码中使用该名字时,就不一定不敏感了。存储在!D.Name系统变量中的图形设备名是以大写字母形式存储的。这在下面的字符串比较语句中尤为重要:

IDL>IF !D.Name EQ 'PS' THEN Print,'Using PostScript'

配置图形硬拷贝输出设备

一旦选定了图形输出设备,所有设备具体的配置参数都用Device命令通过关键字来控制。Device命令可用的关键字主要取决于当前的设备。但打印设备(总是和默认的打印机相连)的设置也可以使用Dialog_PrinterSetup命令来设置(详见201页的“配置和使用打印设备”)

测定当前的设备配置

使用Help命令,可以知道当前硬拷贝输出设备所设定的配置参数,如下:

IDL>Help,/Device

将能看到一系列的有关当前图形设备的当前设置参数及其参数值。这些信息可以用来配置设备。关于设备可用的颜色数,IDL使用的是哪种图形函数以及当前选择的硬件字体等等信息,都取决于所设定的当前设备是何种设备。

注意,这些信息的显示随着每个硬拷贝输出选项的不同而不同。例如,键入下面这些命令来看PostScript输出设备缺省配置如何:

IDL>thisDevice=!D,Name

IDL>Set_Plot,'PS'

IDL>Help, /Device

IDL>Set_Plot, thisDevice

以下为Help命令的显示结果(Windows NT机器上)

Available Graphics Devices: CGM HP NULL PCL PRINTER PS WIN Z

Current graphics device: PS

File:

Mode: Portrait, Non-Encapsulated, EPSI Preview Disabled, Color Disabled

Offset (X,Y): (1.905,12.7) cm., (0.75,5) in.

Size (X,Y): (17.78,12.7) cm., (7,5) in.

Scale Factor: 1

Font Size: 12

Font Encoding: AdobeStandard

Font: Helvetica TrueType Font:

# bits per image pixel: 4

Font Mapping:

(!3) Helvetica (!4) Helvetica-Bold

(!5) Helvetica-Narrow (!6) Helvetica-Narrow-BoldOblique

(!7) Times-Roman (!8) Times-BoldItalic

(!9) Symbol (!10) ZapfDingbats

(!11) Courier (!12) Courier-Oblique

(!13) Palatino-Roman (!14) Palatino-Italic

(!15) Palatino-Bold (!16) Palatino-BoldItalic

(!17) AvantGarde-Book (!18) NewCenturySchlbk-Roman

(!19) NewCenturySchlbk-Bold (!20)

常用的Device命令关键字

大部分输出设备能允许以下关键字被用于Device命令(Z 设备例外)。以下为想要知道的关键字。对于某个特定输出设备所使用的其它关键字可以查阅IDL在线文档资料。例如,PS设备能接受将近50种不同的关键字。

Close_Document 这个关键字在刷新了输出缓冲区后关闭图形文档。它被用于从打印机中排出打印页(使用Printer设备时)。

Close_File 这个关键字在刷新了缓冲区之后关闭该图形输出文件。

Filename 图形输出设备如果是将输出写入一个文件时有一个缺省文件名。如果没有指定文件名时就使用该文件。一般情况下,该文件名为idl.optionoption是所选择的硬拷贝输出设备类型。但也可以使用此关键字指定一个文件名来更改它。例如:

IDL>Device,Filename='surface.eps'

Inches 如果设置了这个关键字,那么关键字XSizeYSizeXOffSetYoffSet及其设置都被认为是以英寸为单位而不是以缺省的厘米为单位来给定的。

IDL>Device,XSize=4.0,/Inches

若要回到以厘米为单位来设定尺寸和偏移量,用:

IDL>Device,Inches=0

Landscape 该关键字表示在纸的横向上输出。

Portrait 该关键字表示在纸的纵向上输出。这是缺省值。

XOffSet 该关键字确定输出的显示窗口的左下角在纸上的X方向上位置(在纵向模式下)。关于横向模式下的位置详见199页的“计算 PostScript在横向模式下的偏移量”。

XSize 该关键字确定输出显示窗口在纸上的宽度。

YOffSet 该关键字确定输出的显示窗口的左下角在纸上的Y方向上位置(在纵向模式下)。关于横向模式下的位置详见199页的“计算 PostScript在横向模式下的偏移量”。

YSize 该关键字确定输出显示窗口在纸上的高度。

IDL>Device,XSize=4.0,YSize=7.0,/Inches

注意一旦在图形输出设备上设定了某个关键字的值,该参数将一直有效,直到显式地更改它或退出IDL

XSize,YSize,XOffSetYOffSet这些关键字一般是用于在输出页面上定位“图形窗口”。 IDL命令使用图形窗口的方式和图形输出使用位于显示设备上的图形窗口的方式完全一样。详细细节参考184页的“显示设备与PostScript设备的相似之处”。

创建PostScript文件

当前的图形设备总是储存在系统变量!D.Name中,所有图形命令将指向它。因此,实际上,尤其在IDL的程序中,选择一个硬拷贝输出设备的代码一般都类似于下面这个例子,在这个例子中,先创建数据然后送到名为output.ps的一个PostScript文件中。注意,设备如何选择,如何配置,如何在图形命令写入文件后关闭。

如果在关闭被打印机处理的文档时失败,它就不能将该页从打印机中排出,因为该文档缺乏PostScript Showpage命令。该命令用于将该页排出。如果使用的是一台慢速打印机,这点就可不必关心。可以在打印机工作的时候,站起来喝一杯咖啡。

IDL> data= LoadData(1)

IDL> thisDeivce=!D.Name

IDL> Set_Plot, ‘PS’

IDL> Device, Filename=’output.ps’, XSize=4, Ysize=4,$

/Inches, Xoffset=2.25, Yoffset=3.5

IDL> Plot, data

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

将图形送到硬拷贝设备中

对于制作硬拷贝输出的一般概念是,用Set_plot命令选择硬拷贝设备,,用Device命令并按要求设置该设备(或者在使用打印机的情况下,有时可用Dialog_PrinterSetup),执行和用于输出到显示设备相同的IDl命令。然而这些命令将输出到文件或打印机,而不是输出到显示设备上。当完成调用IDL的图形命令后,关闭输出文件或打印任务,并以便把文件传送指向所选择的打印机或绘图仪。如果是使用打印机,路由传送是自动完成的。(详见181页的“打印PostScript文件”的关于将IDL产生的PostScript文件传送到打印机的章节)。

例如,要创建一个PostScript文件,可以键入如下命令:

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’

IDL> Device, Filename=’plot.ps’, XSize=4, Ysize=4, $

/Inches, Xoffset=2.25, Yoffset=3.5

IDL> Plot, LoadData(1)

IDL> Device, /Close_File

如果在UNIX机器上产生这个PostScript文件,可以调用一个简单的lpr命令来将文件导向打印机(或者,机器上任何的等效命令)。例如,从IDL中,可以键入这条命令:

IDL> Spawn, ‘lpr plot.ps’

广义上讲,在显示设备上的输出和PostScript文件中的输出并非完全不同。(麻烦在于细节)。也就是说,PlotSurfaceContour以及其它IDL图形命令无论是在显示设备上还是在PostScript文件中操作几乎一样。

一方面,它们在如何进入文件这方面相似。例如,如果调用PlotSurface命令,并且显示设备为当前工作的图形设备,当前窗口的内容将被擦除,建立一个新的图形显示。在PostScript设备为当前图形设备时,类似的情况也会发生。每个命令将擦除显示设备上的窗口,启动一个新的PostScript输出页面。

相应地,每个图形命令,例如OplotXoutS,将在当前显示窗口中被执行,修改当前PostScript输出页面。例如,要显示一幅用XYOutS命令创建的带标题的图和一幅曲面图,可按如下键入:

IDL> Plot, LoadData(1), Position=[0.1,0.1,0.9,0.8]

IDL> XYOutS,0.5,0.9,’Simple Plot’,Align=05,/Normal

IDL> Surface,Dist(41)

如果这些命令被用到PostScript设备上而不是显示设备,将得到有两页输出的一个文件。要将这些命令的结果送到一个PostScript文件,可以按如下键入命令:

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’

IDL> Device, XSize=3, Ysize=3, /Inches

IDL> Plot, LoadData(1), Position=[0.1,0.1,0.9.0.8]

IDL> XYOuts,0.5,0.9,’Simple Plot’, Align=0.5,/Normal

IDL> Surface, Dist(41)

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

注意,无论是在显示窗口还是在PostScript窗口,都可以用关键字PositionNormal来放置图形显示单元。这是一种用于创建在显示窗口的输出和在PostScript窗口的输出相同的好方法。关于此一会将学到更多的东西。

有个技巧可以用于强制让PostScript文件前进一页,这就是使用Erase命令。如果要将几幅图像放在一个PostScript文件中,这也很方便。正常情况下,TVTVScl命令不擦除前面窗口的内容,所以,多个TV命令将简单地在前一幅图像上面叠放下一幅。Erase命令可以将多幅图像放在同一文件中的不同页面。如下:

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’

IDL> TV, LoadData(5)

IDL> Erase

IDL> TV, LoadData(7)

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

打印PostScript文件

UNIX机器上打印PostScript文件的最简单方法是调用lpr命令(或机器上其它任何的等效命令)。但很可能犯一个的错误,企图在IDL中用类似如下的命令来打印PostScript文件:

Set_Plot, ‘PS’

Device, Filename=’new_plot.ps’

Plot, my_data, Title=’Awful Nice Plot’

Spawn, ‘lpr new_plot.ps’

不幸的是,这样行不通。原因是在试图用UNIX命令lpx打印PostScript文件之前,忘了关闭它。正确的顺序是:

Set_Plot, ‘PS’

Device, Filename=’new_plot.ps’

Plot, my_data, Title=’Awful Nice Plot’

Device, /Close_File

Spawn, ‘lpr new_plot.ps’

上面第一组命令失败的原因是,PostScript文件需要一个PostScript Showpage 命令来从打印机中排出该页面。然而,只有使用Close_File命令或退出IDLShowpage 命令才被插入到PostScript中。

在个人电脑上,在IDL中打印用PostScript设备产生的PostScript文件则有一点难度。事实上,大部分人都不介意,因为现在已有无数适合这种机器的工具来打印PostScript文件。

在运行MacOS系统的计算机上打印PostScript文件

在一个Macintosh机器上或是运行MacOS操作系统的计算机上,将一个PostScript文件送到打印机的最好方法是从Bare Bones 软件公司下载一个免费的小程序Drop·PS。可以从一般的Macintosh匿名的ftp软件网站下载。Macintosh打印机总是附带一些打印工具,也能直接将PostScript文件传送到打印机上。

Windows计算机上打印PostScript文件

Windows 95Windows NT操作系统上,将一个PostScript文件送到打印机的最好方法是下载一个免费的软件 GhostViewGhostScript。这些工具是PostScript文件浏览器,可以在打印前预览输出。GhostView有一个漂亮的图形化界面,可以把PostScript文件直接传入打印机。详细资料可用通过WWW浏览器访问下列网址:

http://www.cs.wise.edu/~ghost/

GhostScript也有运行于UNIXMacOS操作系统上的版本。

另外,还有一个很有意思的工具叫PrintFile。这个小工具实现了拖放功能,而且能将PostScript文件传送到本地或网络打印机。它甚至还能打印封装的PostScript文件。可以在下列网址找到这个程序:

http://heml.passagen.se/ptlerup/prfile.html

生成封装的PostScript文件输出

要生成能包含在其它文件(比如杂志文章和书等)中的PostScript输出,在输出图形到PostScript文件前,必须在选择封装选项:

Set_Plot, ‘PS’

Device, /Encapsulated

IDL的封装PostScript文件可以成功地放到LaTeXMicrosoft WordFrameMaker和其它一些文字处理文档中。

注意,PostScript封装文件不能在PostScript打印机上通过自己打印,尽管打印机在不停地动。因为,封装文件缺少PostScriptShowpage命令,此命令用于从打印机上排出该页面。这些文件必须被包含或‘封装’在其它文件中进行打印。

同时也要注意,当将封装文件输入另一个文件中时,可能无法看到该图形,直到打印出来。除非有一个PostScript预览器或者用下面将要描述的Preview关键字。

关闭封装PostScript文件,可以将Encapsulated设置为0,如下;

Device, Encapsulated=0

封装PostScript图形的预览

在正常情况下,封装的PostScript文件不能在包含它的文档中显示。也就是说,拥有此输入文件的方框总是白色或灰色。然而,PostScript图形在整个文档被送到PostScript打印机时,可以正确的打印。

如果想让文档中的该图形能看见,必须设定Preview关键字。此关键字能让PostScript驱动程序包含一幅该图形的位图和PostScript描述。这幅位图将显示在文档中的方框内,在文档被打印时就使用PostScript描述。

Device, /Encapsulated, /Preview

注意并非所有的文字处理程序都能显示位图预览图像。例如,预览图像在Microsoft Word 5.1Macintosh机器上的FrameMaker 4.0上不能很好地显示。但在Windows NT机器上的FrameMaker 5.1就能很好地显示。用自己的文字处理软件试一下,看看显示如何。

要将预览关闭,将关键字Preview设为0即可。如下:

Device, Preview=0

注意,在IDL5.2中预览功能在MacintoshWindows中有很大的提高。把Preview关键字值设为2,便可以创建一个带有一幅TIFF预览图像的封装PostScript交换文件。文件的PostScript部分用于在PostScript打印机上打印。

生成彩色的PostScript输出

IDL中支持彩色的PostScript输出。要输出彩色的输出,在PostScript设备上使用Color关键字:

Set_Plot, ‘PS’

Device, Color=1

颜色关键字的设置自动地将当前色彩表复制到PostScript文件中。(类似于下面Set_Plot命令中的Copy关键字。)注意PostScript设备几乎总是支持256色,通常多于在显示设备上使用的颜色数。这将影响输出。详见191页的“问题:PostScript设备拥有比显示设备更多的颜色”

另一个自动装载色彩表的方法是在将图形设备设置为PostScript时,使用带Copy关键字的Set_Plot命令:

IDL> Set_Plot, ‘PS’, /Copy

这个命令在文件被打开的第一次操作时,自动地将当前的颜色矢量复制到PostScript文件中。注意,是显示色彩表被拷贝到PostScript文件中。通常这些色彩表的颜色数目和PostScript文件的色彩表的数目不同。详见189页的“问题:PostScript设备使用背景与绘图颜色的区别”。

一旦设定PostScript设备为当前图形设备,可以用归一化的色彩表装载命令来装载色彩表。例如,可以键入如下命令:

IDL> LoadCT, 5, Ncolors=200

IDL> TVLCT, [70,255],[70,255],[70,0],200

要将颜色选项关闭,可将Color关键字设为0,如下:

Device, Color=0

PostScript中的彩色图像与灰度图像

缺省情况下,PostScript设备为每一图像像素保存4位的信息。这对16色或灰度级是足够了。如果想在PostScript输出中能有更多的颜色,Device 命令的Bits_Per Pixel关键字能设置到8位。例如,要输出一幅使用了全部256色的图像,可以如下设置设备:

IDL> image=LoadData(7)

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’

IDL> Device, Color=1, Bits_Per_Pixel=8

IDL> TVSCL, image

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

真彩图像

读者的PostScript设备也许能支持24色或真彩图像。真彩图像是一个3D的数组,其中有一维是3。例如,一幅m*n的真彩图像可以是隔像素扫描(3,m,n),也可以是隔行扫描(m,3,n),还可以是隔波段扫描(m,n,3)

真彩图像可以以显示在显示器上的相同方式来显示在PostScript中。就是,在TVTVScl命令中使用True关键字,以表明真彩图像如何扫描的。确保将Bits_Per_pixel关键字的值设为8。例如,一幅隔像素扫描真彩图像可以送到一个真彩PostScript设备上:

IDL> image3d=LoadData(16)

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’

IDL> Device, Color=1, Bits_Per_Pixel=8

IDL> TV, image3d, True=1

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

在继续阅读本章的内容前,确保当前的图形输出设备是显示设备。若不能肯定,使用以下命令:

IDL> Set_Plot, ‘X’ ; ‘Win’ ‘Mac’

PostScript设备上创建高质量的输出

创建看上去类似于显示设备输出的高质量硬拷贝输出的秘诀在于要理解显示设备和输出设备之间的共同点与不同点,比如,考虑显示设备和PostScript设备之间的相同点。

显示设备和PostScript设备之间的相同点

最明显的相同点就是在每种设备上为显示图形而创建的图形窗口,尽管在每种设备上使用的方法不同。在一般的显示设备上可能会以下面的代码来创建图形窗口:

Window, XSize=300, YSize=400, XPos=100, YPos=200

创建了一个X方向300像素和Y方向400像素的图形窗口。此窗口的左下角位于显示器(比如,显示器的分辨率为1024*768)的(100200)处。

而在PostScript设备上创建一个图形窗口的操作是类似的。区别在于不是使用Windows命令来创建。(当PostScript设备为当前图形输出设备时,Window命令是个无效的命令,这点在写程序的时候必须记住。)而是用Device命令来告诉PostScript设备要创建的窗口的大小。例如:

Device, XSize=3, YSize=4, XOffset=1, YOffset=2, /Inches

可以这么想,PostScript页面类似于整个显示设备,而用Device命令创建的区域类似于显示设备上的图形窗口。换句话说,调用上面的命令的含义是在显示设备上或在将要输出图形的页面上创建一个位置。

IDL使用归一化原则把图形放入任何一个窗口。那么,:当键入以下这样一个命令后会怎么样?

Plot, FindGen(11)

IDL使用归一化原则来将图形定位于窗口中。在此例中,IDL用设备坐标来计算字符的大小,并通过它来决定图形缺省的边缘。该图形在这个边缘的基础上被置在窗口内,一般是正好填满整个图形窗口。

但是在显示设备上的图形与在PostScript设备上的输出图形是否一样呢?尽管会很相似,很可能不是。原因在于在显示设备上对图形的解释方式与PostScript设备不一样。

显示设备与PostScript设备之间的不同点

显示设备与PostScript设备之间有几个不同点,这对于要想在PostScript设备上输出与显示设备上几乎一样的图形是非常关键的。有一两个例外的情况,它们的差别不是很大,或者这些差别看上去不重要。但是以笔者个人的经验来看,若没有理解这些差异,要想生成高质量的硬拷贝输出将费很大的精力。

问题:PostScript窗口可能会有不同的纵横比例

首先,一个相对较小的不同点,在显示设备上创建的图形窗口与在PostScript页面上创建的图形窗口的纵横比例可能不同。这并不奇怪,因为两个窗口的创建方法不同:显示设备上是使用Windows命令,PostScript页面是使用Device命令。

事实上,大部分使用者在IDL中显示图形时不用Windows命令。而是简单地使用PlotSurface命令以及它们打开的一个窗口。缺省窗口的大小随机器不同而不同,而且可由用户设置。在工作站上,缺省的窗口大小为640*512像素大小。在PC上,缺省的窗口大小通常为显示设备尺寸的四分之一。在PostScript设备上,缺省的窗口大小为7*5英寸。三种情况下的纵横比(Y/X)为0.8000.7500.714

很清楚,同样Plot命令的输出在三个窗口中不同,因为三个窗口纵横比不一样,而且,IDL将填满Plot命令所获得的窗口。

解决方法:让图形窗口的纵横比保持不变

所以,创造完全一样的输出的第一条原则就是确保显示窗口和PostScript窗口具有相同的纵横比。这很容易做到。只要计算当前显示窗口的纵横比,并将PostScript窗口设为一致即可。例如(假设在显示器上已经有一个打开的窗口),可以键入:

IDL> aspectRatio=Float(!D.Y_Vsize)/D.X_Vsize

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’

IDL> Device, XSize=5, Ysize=5*aspectRatio, /Inches

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

这样,在显示窗口与PostScript输出中看上去相同的可能性就比以前大多了。

笔者喜欢用PSWindow程序来创建一个与当前显示窗口有相同纵横比的PostScript图形窗口。(pswindow.pro在已经下载的本书配套文件之中)。该程序返回在PostScript页面上创建所能创建的最大图形窗口时所必须的尺寸和偏移量(默认以英寸为单位),所建立的窗口与当前图形窗口具有相同的纵横比。返回值用来设置Device命令的相应关键字,通常是它的_Extra关键字。(关于_Extra关键字详细信息见240页的“使用关键字继承”)

看看它是如何使用的,首先打开一个图形窗口,并显示一幅线画图。

IDL> Window, XSize=400, YSize=300 ; Aspect Ratio=0.75

IDL> curve=LoadData(1)

IDL> Plot, Curve

现在用相同的纵横比创建一个PostScript窗口,并在上面画图。键入:

IDL> rightSize=PSWindow()

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’

IDL> Device, _Extra=rightSize, /Inches, File=’test.ps’

IDL> Plot,curve

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

如果有PostScript打印机或PostScript预览软件,将此文件传给它。比较输出内容和显示窗口中的内容。一样吗?

不同?但相似吧?请继续!

问题:PostScript设备有更高的显示分辨率

在默认状态下,IDL在字符尺寸的基础上计算出图形的边缘,从而决定将图形的坐标轴放在图形窗口的何处。但用于计算边缘的字符尺寸在PostScript设备上和在显示设备上不一样。

原因是PostScript设备有一个比显示设备更精细的分辨率。可以检查IDL系统变量!D.X_PX_CM(决定每厘米的像素个数)和!D.X__CH_SIZE(以设备坐标决定缺省字符X方向上的尺寸),看看有何不同。输入:

IDL> thisDevice=!D.Name

IDL> Print, !D.X_PX_CM, !D.X_CH_SIZE

IDL> Set_Plot, ‘PS’

IDL> Print, !D.X_PX_CM, !D.X_CH_SIZE

IDL> Set_Plot, thisDevice

例如,在Macintosh计算机上的数据为:

Mac: 28.35 6

PS: 1000.00 222

换句话说,在显示屏上的一个像素,在PostScript上就有大约35个像素。而且,两种设备的字符尺寸相对于分辨率的比率也不一样的。Macintosh:0.212PostScript 0.222

马上就明白了,在IDL中用设备坐标或像素坐标来定位任何一图形是个不好的主意,除非将分辨率因素考虑进去。例如,假设想在显示器上围绕一个X方向像素从100200Y方向像素从150250的图像周围画一个方框,可能会这样画

xBox=[100,100,200,200,100]

yBox=[150,250,250,150,150]

PlotS, xBox, yBox, /Device

在一个400*400相似素的显示窗口上,方框与窗口的大小之比为1:16。在10*10厘米的PostScript窗口上,方框与窗口的大小之比将为1:10,000!这是相当小的盒子,肯定不是所要的。

解决方法:不用设备坐标来定位图形

创建实际一致的图形输出的第二条原则是,确保在输出窗口中使用数据或归一化坐标而不是设备坐标来在图形窗口中定位图形。

例如,如果按下面这样定义上面的方框,它将在显示窗口和PostScript窗口两者中包围同样的相对区域:

xBox=[0.250, 00,200,200,100]

yBox=[150,250,250,150,150]

PlotS, xBox, yBox, /Device

字符尺寸与分辨率的比率影响输出的另外一种方式是,在图形窗口中放置图形输出的方法。回想一下,缺省情况下,IDL使用边缘来在窗口中定位图形以及基于字符尺寸计算边缘。如果字符尺寸在显示设备上和在PostScript输出中不同,这将稍微影响图形输出。

但可以用Position关键字来定位图形从而弥补这一点。 无论是使用显示窗口还是PostScript 窗口,都可用归一化坐标来将坐标轴定位在准确的地方。(详见50页的“设置图形位置”。)

上面简单的图可以使用以下命令以相同的方式放到任何一个窗口中。

Plot, Load Data(1), Position=[0.1, 0.1,0.95,0.95]

问题:PostScript设备能使用不同的显示字体

缺省时,IDL使用Hershey字体输出图形。Hershey字符集是一种典型的矢量字体。这些字体是用一些矢量描述的,显示时象被着色一样。使用矢量字体有两大优点:它们能很容易地在3D空间中缩放和旋转,而且与设备无关。矢量字体最大的缺点是:在象PostScript打印机这类高分辨率输出设备上,其质量不如真实的PostScript字体。

正因为如此,许多人趋向于用PostScript字体来输出 PostScript输出图形。这就产生了在显示屏上与在PostScript输出中稍有差异,因为在 PostScript打印机上没有与Hershey矢量字体一一对应的字体。PostScript字体必须代替Hershey字体。这导致字体字符的大小不同,这可能导致文字排列的问题。

解决方案:仔细设计和定位文字

这个解决方法就是要注意如何设计文本的输出。例如,如果可能的话,标题应以点为中心或者在XYOutS命令中用Alignment关键字来特意布置在某些点上。可以从图65中看出Hershey和真实的PostScript字体的区别。

65:左边的图是用Hershey Simplex Roman字体创建的。右边的图是用PostScript Helvetica字体创建的。两幅图看上去类似,但不同。

要选择一种真实的PostScript字体,可将系统变量!P.FontFont关键字设为0。若没有其它信息的话,IDL将根据表10的映射关系将Hershey字体映射到PostScript字体。可以使用以下命令随时查询IDL中的这种映射关系:

Set_Plot, ‘PS’

Help, /Device

注意,下表中的正常的默认字体Simplex Roman被映射到 Helvetica。在PostScript的输出中,在同样的字体尺寸下,Helvetica的字体稍大于Simplex Roman。也就是说,应在图形输出时,使用代替字体定位文本必须小心,要用一种合理的从显示到硬拷贝的过度方式。

实际中,这就意味着要将调节输出文本左右或中心对称的坐标归一化。例如,下面的代码是在图上生成一个图例:

Plots, [0.2,0.3], [0.7,0.7], /Normal

Plots, [0.2,0.3],[0.6,0.6], LineStyle=3, /Normal

XYOutS,0.32,0.7, ‘Normal bias’, /Normal, Alignment=0.0

XYOutS,0.32,0.6, ‘No bias’, /Normal, Alignment=0.0

这个代码用来在显示窗口和PostScript窗口两者相同的相对位置处定为文本。

注意,能用Device命令改变字体映射关系。如:字体!4一般被映射为Helvetica-Bold PostScript字体。若要改为Palatino-Bold-Italic字体,应键入:

Device, /Palatino, /Bold, /Italic, Font_Index=4

Palatino-Bold-Italic字体用于上述的图例中,可键入。

Plots, [0.2,0.3], [0.7,0.7], /Normal, Font=0

Plots, [0.2,0.3],[0.6,0.6], LineStyle=3, /Normal

XYOutS,0.32,0.7, ‘!4Normal bias!X’, /Normal, Alignment=0.0

XYOutS,0.32,0.6, ‘!4No bias!X’, /Normal, Alignment=0.0

在上面的字符串中的!X将字体返回为使用!4之前的字体。关于 XYOutS命令的用法详见55页的“在图形显示中添加文本”。

p

< class=' _19'>

序号

Hershey字体

PostScript字体

p

< class=' _19'>

!3

Simplex Roman

Helvetica

p

< class=' _19'>

!4

Simplex Greek

Helvetica-Bold

p

< class=' _19'>

!5

Duplex Roman

Helvetica-Narrow

p

< class=' _19'>

!6

Complex Roman

Helvetica-Narrow-BoldOblique

p

< class=' _19'>

!7

Complex Greek

Times-Roman

p

< class=' _19'>

!8

Complex Italic

Times-BoldItalic

p

< class=' _19'>

!9

Math and Special

Symbol

p

< class=' _19'>

!10

Special

ZapfDingbats

p

< class=' _19'>

!11

Gothic English

Courier

p

< class=' _19'>

!12

Simplex Script

Courier-Oblique

p

< class=' _19'>

!13

Complex Script

Palatino-Roman

!14

Gothic Italian

Palatino-Italic

!15

Gothic German

Palatino-Bold

!16

Cyrillic

Palatino-BoldItalic

!17

Triplex Roman

AvantGarde-Book

!18

Triple Italic

NewCenturySchlbk-Roman

!19

Undefined

NewCenturySchlbk-Bold

!20

Miscellaneous

Undefined

10:缺省的Hershey字体与PostScript字体之间的映射关系。Hershey字体一般用于显示设备上。PostScript字体一般用于PostScript输出。

问题: PostScript设备使用背景颜色和绘图颜色时的不同

另外一个显示设备与PostScript设备的不同是PostScript处理颜色的方式不同。例如,PostScript设备把正常的背景颜色和绘图颜色反过来。在显示器上输出时,背景色是由!P.Background系统变量控制的。当启动IDL时,该变量被设为0,意味着IDL使用当前色彩表中的第0号颜色作为背景颜色。IDL带的大多数的色彩表的0号色都是黑色。黑色的背景下,当把图形输入PostScript设备时,使耗用很多色粉。因此,当将PostScript设备设为当前图形设备时,IDL自动将此变量的值改为255

但是IDLPostScript输出处理比这更隐蔽,因为,无论用什么颜色索引值替换255,只能获得一份白色背景的PostScript输出。也就是说,PostScript 实际上除了白色忽略了其它任何背景颜色。即使将背景颜色设为不是255的值,上面这个规则仍然起作用。例如,可以尝试用以下命令在获得一个具有碳灰色背景的绿色图形:

TVLCT,[0,70],[255,70],[0,70],100

Plot, LoadData(1), Color=100, Background=101

然而,这两个命令在显示屏上输出正确,但在PostScript输出中是一白色背景的绿色图形。

解决方法:理解PostScript如何处理背景颜色和绘图颜色

PostScript输出中得到其它颜色的背景的唯一方法是,把某种特定的颜色作为背景图来着色处理。例如,可能用PolyFill命令,如下:

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’

IDL> Device, /Color, Bits_Per_Pixel=8, File=’example.ps’

IDL> TVLCT, [0,70],[255,70],[0,70],100

IDL> PolyFill,[0,1,1,0,0], [0,0,1,1,0], /Normal, Color=101

IDL> Plot, LoadData(1), Color=100, /NoErase

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

绘图颜色同样可以被PostScript设备改变了。系统变量!P.Color通常是设为色彩表中的最后一种颜色。在显示设备上等于!D.Table_Size-1。例如,运行IDL时有220种颜色,!P.Color的值就为219。而如果选择了PostScript设备,!P.Color的值总是0

这意味着,如果用IDL缺省时装载的灰度色彩表在显示设备上画图,将看到黑色背景下的白色图形。如果在PostScript文件中做同样的事情,将看到白色背景下的黑色图形。如图66所示。

绘图色总是受到PostScript设备的尊重,这点不象背景色。所以,能够用!P.Color指定一个除0以外的颜色,就可以在显示器上和PostScript中用该颜色着色图形。也可以使用Color关键字和一个给定的值来画图,这个颜色将同时受到显示设备和PostScript的尊重。例如,下面两行命令总是绘出红色图形,不管是显示器上还是在PostScript输出中:

TVLCT, 255,0,0, 100

Plot, LoadData(11), Color=100

注意,在灰度打印机上,颜色将由经过抖动处理的线条代替,至于是显示点还是虚线,取决于打印机的分辨率。实际中,这意味着如果要在灰度打印机上输出,最好确保绘图颜色是黑色。

66PostScript将背景色和绘图色反色。因此,在显示上是黑底白图,但在PostScript上是白底黑图。

问题:PostScript设备的颜色数目多于显示设备

PostScript设备与显示设备的另外一个不同的方面是它们所使用的颜色数。PostScript通常至少能显示256种颜色。一般情况下,用户在显示设备上使用的颜色少于256种。可以通过打开一个图形窗口并打印系统变量!.D.Table_Size的值来得知现在IDL所使用的颜色数量,如下:

IDL> Window

IDL> Print, !D.Table_Size

通常,这个颜色数量在200240之间。如果在一个8位显示卡的PC机上运行IDL,这个值总是少于256色。在具有8位显示卡的其它计算机上,这个值将会更少,除非有自己的色谱表。如果在显示数据时不注意,这个差别就会影响输出。

例如,当在IDL运行中使用200种颜色,而且想用一个灰度色彩表来显示图像。可以按如下装入色彩表:

IDL> LoadCT, 0

这个命令在色彩表文件中查找组成灰度色彩表的红、绿、蓝颜色矢量,并重采样这些矢量,以便它们可以代表IDL运行时所使用的颜色。在此例子中,被载入实际的色表中的矢量为200元素。要显示图像,可按如下这样:

IDL> image=LoadData(7)

IDL> TVScl, image

它看上去像图67中左边的图像。

如果想将这幅图像存到PostScript文件中,可以将PostScript设备设置为当前图形设备(用Copy关键字将当前的色谱表拷贝到PostScript文件中),并从新调用上面的TVScl命令。例如,可按如下操作:

IDL> thisDevice=!D.Name

IDL> Set_Plot, ‘PS’ , /Copy

IDL> Device, XSize=3, Ysize=3, /Inches, /Color, $

Bits_Per_Pixel=8, File=’image.ps’

IDL> TVScl, image

IDL> Device, /Close_File

IDL> Set_Plot, thisDevice

然而,如果这样做,可能会对结果很失望。输出可能类似于图67中右边的图像。这就是说,PostScript输出上的灰度阴影不同于显示设备上的灰度阴影。

产生这种现象的原因在于色彩表装入到PostScript设备时的方式。当调用Set_Plot命令时,IDL将显示色彩表的前200种颜色复制到PostScript色彩表中相应的颜色中去。(无论是否使用Copy关键字都是这样。)但它并不影响颜色索引 号在200以上的颜色,这些颜色早就被初始化为灰度级颜色。看看体现在PostScript文件中的红色矢量的图就知道发生什么了。这个矢量应该是线性型的,但在图68中,索引号为200时极不连续。那么图像中像素值大于199的像素在PostScript输出中将用不正确的颜色显示。

67:如果不注意颜色,显示设备上的输出(左图)将不同于PostScript文件输出(右图)。特别是,像素值大于显示设备所使用的颜色数的像素将着色不正确。在此例中,很多像素显示的太亮。

68:在将PostScript设备设置为当前图形设备后的红色矢量图。色彩表中的前200种颜色是从显示设备的色彩表中拷贝过来的。所以,像素值大于199的像素在PostScript将显示的不正确。

本文来源:https://www.2haoxitong.net/k/doc/b24c4485ec3a87c24028c444.html

《IDL入门教程七(上).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式