我想将图像添加到我的 postscript 代码中
%!PS-Adobe-3.0
/Times-Roman findfont
12 scalefont setfont
50 700 moveto
(text) show
showpage
但我不知道这样做。有人帮忙吗?
我想将图像添加到我的 postscript 代码中
%!PS-Adobe-3.0
/Times-Roman findfont
12 scalefont setfont
50 700 moveto
(text) show
showpage
但我不知道这样做。有人帮忙吗?
跳到中间,从更简单的工作流程开始阅读到最后。
{currentfile} image
它记录在Postscript Language Reference Manual中,但信息可能有点难以消化。
正如 Ken 所说,您需要使用image
运算符。我通常选择“老派”形式,即
宽度高度位每像素矩阵 proc 图像 -</p>
对于一些随机图像文件,您通常希望使用convert
ImageMagick 之类的东西来获取文本格式。当然,您也可以将其转换为 eps,但要学习,您必须将手指伸入其中。
% convert image.png image.xbm
这将为您提供如下文件:
1 #define glasses_width 320
2 #define glasses_height 240
3 static char glasses_bits[] = {
4 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5 0x00, 0x00, 0x00, 0x00, 0x45, 0x65, 0xDB, 0x65, 0xB5, 0x6F, 0xBF, 0xEF,
6 0xFF, 0xFF, 0xFF, 0xBF, 0xB5, 0xED, 0x3C, 0xBF, 0xB3, 0xDB, 0xAD, 0xF6,
7 0xE6, 0x4A, 0xAA, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xA8, 0x66, 0xD6,
9 0xDF, 0xF9, 0xF7, 0xBF, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0x7F, 0xFB, 0xEA,
10 0xDD, 0x5A, 0x9A, 0x69, 0xB9, 0xBE, 0x55, 0x65, 0x00, 0x00, 0x00, 0x00,
...
803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
804 };
所以,在 vi 中,做一些事情,比如
:%s/^#/%#/ #comment-out the #defines
:g/[{}]/d #delete the array brackets
:%s/0x//g #remove the 0x prefixes
:%s/, //g #remove the spaces
给出这样的东西:
1 %#define glasses_width 320
2 %#define glasses_height 240
3 000000000003000000000000
4 000000004565DB65B56FBFEF
5 FFFFFFBFB5ED3CBFB3DBADF6
6 E64AAABA0000000000020000
7 000000000000000099A866D6
8 DFF9F7BFFFFDFFFEFF7FFBEA
9 DD5A9A69B9BE556500000000
10 000C00000000000000000000
...
802 000000000000000000000000
然后你在image
调用中使用数字,也修剪这些行,并直接在这些行之后插入数据
%width height depth [ x-scale x-skew y-skew y-scale x-offset y-offset ]=matrix
320 240 1 [ 1 0 0 -1 0 240 ]
% {proc-yielding-string-data} call(image)
{ currentfile 80 string readhexstring pop } image
这假设您的位图数据的 y 向下增加。这种方法可以针对其他 ascii 格式进行调整,只要您可以获得某种原始样本的转储。用解码器代码嵌入压缩图像是一大堆蠕虫,我建议你暂时避免。(主要是因为我还不知道该怎么做。我一直在避免它,就像一个大罐头蠕虫一样。:D)
我检查了上面的建议,我忘记了一个很大的障碍。Postscript 喜欢它的大端字节位图。也就是说,第 7 位是最左边的,而第 0 位是最右边的位。这与 xbm 格式相反。所以,上面介绍的完整程序是:
%!
%reverse the bits in a byte
/reverse { % b
dup 1 and % b b0 % explode the bits
1 index 2 and % b b0 b1
2 index 4 and % b b0 b1 b2
3 index 8 and % b b0 b1 b2 b3
4 index 16 and % b b0 b1 b2 b3 b4
5 index 32 and % b b0 b1 b2 b3 b4 b5
6 index 64 and % b b0 b1 b2 b3 b4 b5 b6
8 7 roll 128 and % b0 b1 b2 b3 b4 b5 b6 b7
-7 bitshift exch % b0 b1 b2 b3 b4 b5 b7-7=0' b6 % shift and combine
-5 bitshift or exch % b0 b1 b2 b3 b4 b0'|b6-5=1' b5
-3 bitshift or exch % b0 b1 b2 b3 b0'|b1'|b5-3=2' b4
-1 bitshift or exch % b0 b1 b2 b0'|b1'|b2'|b4-1=3' b3
1 bitshift or exch % b0 b1 b0'|b1'|b2'|b3'|b3+1=4' b2
3 bitshift or exch % b0 b0'|b1'|b2'|b3'|b4'|b2+3=5' b1
5 bitshift or exch % b0'|b1'|b2'|b3'|b4'|b5'|b1+5=6' b0
7 bitshift or % b0'|b1'|b2'|b3'|b4'|b5'|b6'|b0+7=7'
} def
320 240 1 % width height bitdepth
[ 1 0 0 -1 0 240 ] % 1-to-1 matrix with descending y, offset by max_y
{ %proc-yielding-string
currentfile 80 string % file string
readhexstring pop % string read a line of hex data from THIS FILE
0 1 2 index length 1 sub % string 0 1 strlen-1
{ % string index
2 copy 2 copy % str i str i str i
get reverse % str i str i rev(str_i)
put % str' i
pop % str' % reverse each char (byte)
} for % loop over chars in string
} image
000000000003000000000000
000000004565DB65B56FBFEF
FFFFFFBFB5ED3CBFB3DBADF6
E64AAABA0000000000020000
000000000000000099A866D6
DFF9F7BFFFFDFFFEFF7FFBEA
...
完整程序可在此处附加完整图像数据。
更简单但仍然“动手”的是转换为pbm
使用与 postscript 相同的位排序约定。然后xxd -ps
会产生一个“后记”hexdump。以下三个示例均使用这种方式准备的十六进制数据。但是这个方法还是需要你手动测量header的长度(xxd
用来查找width和height后面的whitespace-char后面的字节偏移量)。
%!
% swar.ps
%
%image example
%image origin: http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Spacewar%21-PDP-1-20070512.jpg/320px-Spacewar%21-PDP-1-20070512.jpg
%
% bash commands to prepare image file:
%
% $ wget http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Spacewar%21-PDP-1-20070512.jpg/320px-Spacewar%21-PDP-1-20070512.jpg
% $ identify 320px-Spacewar\!-PDP-1-20070512.jpg
% $ convert 320px-Spacewar\!-PDP-1-20070512.jpg spacewar.pbm
% $ xxd -ps spacewar.pbm > spacewar.asc
% % gs swar.ps
/infile (spacewar.asc)(r)file def
/buf 256 string def
% use $ xxd spacewar.pbm | head
% to find the length of the header and read that length
% into the buffer and discard, leaving only samples.
infile buf 0 16#5d getinterval readhexstring pop pop
320 215 1
[ 1 0 0 -1 0 215 ]
{ infile buf readhexstring pop } image
showpage
这spacewar.asc
是同样丑陋的裸十六进制样本块。
$ head spacewar.asc
50340a2346696c6520736f757263653a20687474703a2f2f636f6d6d6f6e
732e77696b696d656469612e6f72672f77696b692f46696c653a53706163
65776172212d5044502d312d32303037303531322e6a70670a3332302032
31350a007fffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffffdfffffff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
ffffffffffff803fffffffffffffffffffffffffffffffffffffffffffff
ffffff007ffffffffffffffffffffffff800ffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffff7fe007ff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
只要解释器(或蒸馏器)没有设置 SAFER 选项,这个样本块就可以留在外部,因为这会禁用文件访问操作符。
也可以在图像调用后内联,currentfile
如上所示。
%!
/buf 256 string def
320 215 1
[ 1 0 0 -1 0 215 ]
{ currentfile buf readhexstring pop }
{
infile buf 0 16#5d getinterval readhexstring pop pop % discard header
image
} exec
50340a2346696c6520736f757263653a20687474703a2f2f636f6d6d6f6e
732e77696b696d656469612e6f72672f77696b692f46696c653a53706163
65776172212d5044502d312d32303037303531322e6a70670a3332302032
31350a007fffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffffdfffffff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
ffffffffffff803fffffffffffffffffffffffffffffffffffffffffffff
ffffff007ffffffffffffffffffffffff800ffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffff7fe007ff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
%...
或者,只要数据小于 64k,您就可以将其 slurp 成一个字符串。[注意:这是对字符串大小的历史实现限制。我被告知当前版本的 ghostscript 可以很好地处理更大的字符串。] 如果您想在文档中多次重复使用图像,这很有用。
%!
/imgbuf 320 215 mul 8 div ceiling cvi string def % create a string for byte storage (<64k)
{
currentfile imgbuf 0 16#5d getinterval readhexstring pop pop % read header
currentfile imgbuf readhexstring pop pop % read data (discarding header data)
} exec
50340a2346696c6520736f757263653a20687474703a2f2f636f6d6d6f6e
732e77696b696d656469612e6f72672f77696b692f46696c653a53706163
65776172212d5044502d312d32303037303531322e6a70670a3332302032
31350a007fffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffffdfffffff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
ffffffffffff803fffffffffffffffffffffffffffffffffffffffffffff
ffffff007ffffffffffffffffffffffff800ffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffff7fe007ff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
%...
320 215 1
[ 1 0 0 -1 0 215 ]
{ imgbuf }
image
在上述所有代码中,我对 PLRM 的解释非常自由。基本上忽略了一些常见的建议,因为它通常(根据我的经验)只会妨碍理解这个过程,但在这里......
使用运算符的推荐方法是使用与image
上述不同类型的矩阵。该矩阵实际上被image
算子解释为逆映射。也就是说,按比例放大会使数字变小,按比例缩小会使数字变大。您打算使用它的方式是(修改上面的最后一个示例,因为它是本示例中最短且经过充分考虑的示例,即假设imgbuf
已如上所述填充readhexstring
)。这个调用应该更恰当地写成:
320 215 scale % scale 1x1 image to proper dimensions
320 215 1 % "data" dimensions: w h bit-depth
[ 320 0 0 -215 0 215 ] % inverse mapping
{ imgbuf } % data-acquisition (yield data in a string)
image
也就是说,矩阵将图像反转(这里是“扭曲”的诗意意义,而不是技术意义)成一个 1-unit-X-1-unit 正方形,这允许(要求)您缩放坐标-系统来获得图像的每像素 1pt 渲染。正确的方法为您提供了更大的灵活性:您现在可以320 215 scale
进行合理的缩放计算——如果您只想要一个 1 像素到 1 点的映射,则以重复自己为代价。
要使用正确的代码将图像的尺寸加倍,只需320 215 scale
用640 430 scale
(或添加2 2 scale
)替换即可。
320 215 scale
2 2 scale % == 640 430 scale
320 215 1 % w h bit-depth
[ 320 0 0 -215 0 215 ] % inverse mapping
{ imgbuf } % data-acquisition
image
但是使用hackish方式,您实际上必须将矩阵减半才能获得增长的倒数。:D
320 215 1
[ .5 0 0 -.5 0 430 ] % "doubled,inverted (ie. halved) with double-offset" matrix
{ imgbuf }
image
请参阅 PostScript 语言参考手册,这不是一个简单的主题,您需要仔细阅读。从第 4.10 节开始,至少阅读处理类型 1 图像的部分(4.10.1 到 4.10.5)。
这是一个简单的例子:
/OneComponentString <007ff700> def
/OneComponentImage1
{
<<
/ImageType 1
/Width 2
/Height 2
/ImageMatrix [2 0 0 -2 0 2]
/BitsPerComponent 8
/Decode [0 1]
/DataSource OneComponentString
>>
} bind def
gsave
0 0 moveto
20 20 scale
/DeviceGray setcolorspace
OneComponentImage1 image
grestore
showpage
我会建议一种简单的方法 - 运行 EPS 文件。
首先,将图像转换为 EPS,例如。myimage.eps,将其保存在myfolder中,然后修改您的代码以定义placeEPS运算符并使用它显示myimage.eps 。
%!PS-Adobe-3.0
% Place EPS image definition
% Syntax: <file> <scale> <x> <y> placeEPS
% =============================================================
/placeEPS
{
userdict begin
/__be_state save def
/__ds_count countdictstack def
/__os_count count 5 sub def
/showpage {} def
initgraphics
translate
dup scale
run
count __os_count sub { pop } repeat
countdictstack __ds_count sub { end } repeat
__be_state restore
end
} bind def
% =============================================================
% Your old code starts here
/Times-Roman findfont
12 scalefont setfont
50 700 moveto
(text) show
% Now mark myimage.eps scaled to 100% at position 100, 100
(myfolder/myimage.eps) 1 100 100 placeEPS
showpage
现在通过 Acrobat Distiller 或 GhostScript 转换为 PDF。
您还可以使用此方法将整页画布放置到文档中。