我想在postscript中创建一个有透明孔的图像,如下所示:
我能想到的最好的解决方案是创建一个填充while页面的剪切路径,除了这个洞,如下所示:
我目前的所有帖子的后记代码如下:
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 100 100
%%Pages: 1
%%EndComments
%%EndProlog
% Create clipping path
newpath
-200 -200 moveto
200 -200 lineto
200 200 lineto
-200 200 lineto
closepath
70 50 moveto
60 50 10 360 0 arcn
closepath
clip
% Draw rest of the image
% In the actual image I am working on this rest of the image
% has a bunch of complex shapes.
newpath
20 20 moveto
66 20 lineto
66 70 lineto
20 70 lineto
closepath
0 0.5 0.5 setrgbcolor
fill
在我的解决方案中困扰我的部分是绘制剪切路径我必须绘制一个大于整个页面的大矩形,其中有一些硬编码的大坐标(-200到+200)。有更好的方法吗?
我本来希望能够告诉postcript在以60 50为中心的圆圈外绘制剪切路径,而不需要创建创建所有内容的大矩形。这可能吗?
如果那是不可能的话,我至少会选择一种方法来创建大矩形,而不依赖于硬编码坐标,也许是通过查询图像角的坐标。有没有办法做到这一点?
答案 0 :(得分:2)
首先你需要小心你的术语,PostScript中的'图像'是一个位图(参见image
运算符)所以当你谈论一个图像时,任何理解PostScript的人都会想到一个位图。
其次,你在这里创建一个 EPS ,而不是一个完整的PostScript程序,所以你绝对应该不搞乱整页,结果可能不会是任何用户可能期望的。通过在EPS声明的BoundingBox外写入,您将使其无效。在实践中,大多数应用程序会在您的EPS上围绕其BoundingBox放置一个“剪辑”,但这并不意味着您应该依赖它。
从那里继续前进;你需要填充区域来覆盖整个页面吗?如果是,那么是的,你需要创建一个覆盖整个页面的剪辑。或者更确切地说,是EPS的整个边界框。但是,如果剪辑仅需要与给定对象的大小匹配,那么您只需要将其绘制为对象的大小。
我不明白为什么会这样:
newpath
20 20 moveto
66 20 lineto
66 70 lineto
20 70 lineto
closepath
70 50 moveto
60 50 10 360 0 arcn
closepath
clip
newpath
20 20 moveto
66 20 lineto
66 70 lineto
20 70 lineto
closepath
0 0.5 0.5 setrgbcolor
fill
不会给整个页面设置剪辑提供相同的结果(事实上,它对我来说也是如此)。
显然,您希望将其包含在gsave
/ grestore
对中,以便之后可以撤消剪辑。
回答实际问题;如果您正在编写完整的PostScript程序,您可能会自行发出媒体大小请求,与文档所需的媒体相匹配。所以你已经知道了媒体的大小。但是,在语言级别2或3中,您始终可以向口译员询问当前的媒体大小:
currentpagedevice /PageSize get
将以PostScript为单位返回一个包含两个成员的数组,即当前所选媒体的宽度和高度。
我不记得如何在1级PostScript中检索媒体大小,但实际上你不必担心这一点。