如何在 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 中检索媒体大小,但实际上您不必为此担心。
我想在 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 中检索媒体大小,但实际上您不必为此担心。