%!PS-Adobe-3.0 /Times-Roman findfont 12 scalefont setfont 50 700 moveto (text) show showpage
但我不知道这样做.有人帮忙吗?
解决方法
跳到中间并开始从Simpler Workflow读取到最后.
转换为xbm,使用vi进行hack,使用{currentfile}图像进行内联数据
它在Postscript语言参考手册中有记录,但信息可能有点难以消化.
正如肯所说,你需要使用图像操作符.我通常选择“旧学校”形式
width height bits-per-pixel matrix proc image ‐
对于某些随机图像文件,您通常希望使用像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,0x03,5 0x00,0x45,0x65,0xDB,0xB5,0x6F,0xBF,0xEF,6 0xFF,0xFF,0xED,0x3C,0xB3,0xAD,0xF6,7 0xE6,0x4A,0xAA,0xBA,0x02,8 0x00,0x99,0xA8,0x66,0xD6,9 0xDF,0xF9,0xF7,0xFD,0xFE,0x7F,0xFB,0xEA,10 0xDD,0x5A,0x9A,0x69,0xB9,0xBE,0x55,... 803 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
然后使用图像调用中的数字,修剪这些行,并在这些行之后直接插入数据
%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喜欢它在big-endian字节中的位图.也就是说,第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 ...
提供完整程序,附加完整的图像数据here.
工作流程更简单
更简单,但仍然是“手动”,是转换为pbm,它使用与postscript相同的位排序约定.然后xxd -ps将产生一个“postscript”hexdump.以下三个示例都使用以这种方式准备的十六进制数据.但是这种方法仍然需要你手动测量标题的长度(使用xxd来查找宽度和高度之后的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,您就可以将其插入
一个字符串. [注意:这是字符串大小的历史实现限制.我被告知当前版本的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的解释采取了很大的自由.基本上忽略了一些常见的建议,因为它通常(根据我的经验)只是妨碍了解过程,但在这里……
使用图像操作符的推荐方法是使用与上面显示的不同类型的矩阵.矩阵实际上由图像运算符解释为逆映射.也就是说,为了扩大规模,你可以缩小数字,缩小规模可以使数字更大.你打算使用它的方式是(修改上面的最后一个例子,因为它是这个例子中最短和最好的因素,即假设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单位X-1单位的正方形,这允许(要求)缩放坐标 – 系统获得图像的每像素1pt渲染.正确的方法为您提供了更大的灵活性:您现在可以使用320 215刻度线进行合理的缩放计算 – 如果您只想要1像素到1点的映射,则需要重复自己.
要使用正确的代码将图像的尺寸加倍,可以用640 430比例(或添加2 2比例)替换320 215比例.
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
但是,以黑客的方式,你实际上必须将矩阵减半以获得增长的倒数. :d
320 215 1 [ .5 0 0 -.5 0 430 ] % "doubled,inverted (ie. halved) with double-offset" matrix { imgbuf } image