如何在 Postscript 中绘制一条填满整个页面的路径?

How can I draw a path that fills the whole page in Postscript?

我想在 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)。有更好的方法吗?

我更希望能够告诉 postscript 在以 60 50 为中心的圆圈外绘制剪切路径,而不需要创建创建所有内容的大矩形。这可能吗?

如果那不可能,我至少会更喜欢一种不依赖硬编码坐标来创建大矩形的方法,也许是通过查询图像角的坐标。有办法吗?

好的,首先你需要注意你的术语,PostScript 中的 'image' 是位图(请参阅 image 运算符)所以当你谈论图像时,任何了解 PostScript 的人都会认为就位图而言。

其次,您在这里创建的是 EPS,而不是完整的 PostScript 程序,因此您绝对不应该 将完整的页面,结果可能不会是任何用户所期望的。通过在您的 EPS 声明的 BoundingBox 之外写入,您将使其无效。实际上,大多数应用程序都会在您的 EPS 周围放置一个 'clip' 与其 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

将 return 一个包含两个成员的数组,即当前所选媒体的宽度和高度,采用 PostScript 单位。

我想不起来如何在 1 级 PostScript 中检索媒体大小,但实际上您不必为此担心。