在PostScript中添加图片的简单方法

7

我正在尝试使用postscript编写文档。

到目前为止,我已经能够编写简单的文本,并处理线条和形状。

现在我想向文档中添加一些图片。在网上搜索后,似乎找不到任何清晰的方法来实现这一点。

下面的代码片段是一个hello world示例:

%!PS
/Times               
20 selectfont         
20 800 moveto         
(Hello World!) show
showpage 

我只想通过指定x和y坐标来插入图片(例如PNG,JPG,GIF)。
非常感谢您提供的任何帮助。

1
没有直接的方法让PostScript读取这些格式,但请参见下面@lhf的答案。如果您想直接添加图像,请参阅我的回答http://stackoverflow.com/questions/4924819/converting-writing-a-bufferedimage-to-postscript - jsbueno
4个回答

11

有一种简单的方法,而Postscript支持jpeg格式。如果您正在使用ghostscript,则可能需要使用-dNOSAFER选项打开文件。下面是一个示例:

gsave
 360 72 translate     % set lower left of image at (360, 72)
  175 47 scale         % size of rendered image is 175 points by 47 points
  500                   % number of columns per row
  133                    % number of rows
  8                    % bits per color channel (1, 2, 4, or 8)
  [500 0 0 -133 0 133]       % transform array... maps unit square to pixel
  (myJPEG500x133.jpg) (r) file /DCTDecode filter % opens the file and filters the image data
  false                 % pull channels from separate sources
  3                    % 3 color channels (RGB)
  colorimage
grestore

要不把它做成一个过程,接受(文件名,x,y,wid,ht)作为参数?它还可以接受一个额外的参数来指定哪个角应该在(x,y)处。如果你正在进行快速和肮脏的排版,左上角更容易处理。 - luser droog
它可以放在一个过程中,但上面的大部分代码只是按正确顺序将数据放入堆栈以供colorimage命令使用。左下角并不是一个选择,它是由Postscript定义的。Postscript将0,0定义为页面的左下角,因此如果你理解我的意思,Postscript本地方法也是以左下角为中心的。你可以选择将x,y定义为左上角,但你的函数必须为你转换为左下角坐标。 - Hath995
是的,我并不抱怨什么。但要考虑提问者的水平......实际上,我收回之前说过的话!做这个练习是非常完美的。而且你已经给了所有需要的东西! - luser droog

3
使用类似convert的程序,然后删除它生成的任何额外代码。

2
pnmtops 生成的代码可能更易于理解。请参见 http://netpbm.sourceforge.net/doc/pnmtops.html - lhf
对于直接的位图,转换为.xbm非常方便,但是每个字节中的位是反向的。 - luser droog

1

0

这是一个晚回答!-dNOSAFER的问题阻止了我使用其他解决方案,所以我做了以下操作:

使用Python将JPG文件作为二进制读取并将其转换为字符串,与/ASCIIHexDecode兼容:

''.join(["%02x" % ord(c) for c in open(filename, "rb").read()])

然后,不要从PostScript文件中读取和解码图像文件,而是将上述计算出的字符串粘贴到PostScript文件中,并通过/ASCIIHexDecode/DCTDecode进行过滤:

(ffd8ffe000104a46494600010102002700270000ffdb004300030202020202030202020303030304060404040404080606050609080a0a090809090a0c0f0c0a0b0e0b09090d110d0e0f101011100a0c12131210130f101010ffdb00430103030304030408040408100b090b1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010ffc00011080010001003011100021101031101ffc400160001010100000000000000000000000000060507ffc40026100002020201030207000000000000000001020304051106071221001315163132414252ffc400160101010100000000000000000000000000070403ffc4002911000201030105090100000000000000000102030004210711123151531314324142617381d1d3ffda000c03010002110311003f00de311d00e0478be19acddc79b0f8ba734aef8aa8a59a4af1c9bdc96159beef275e4efd1ccfa5f2aceea2f8e09f41e7f252a47ab4c4093ba71ceced387b7828b724e87705b588c8478ecac114e28d89e36f83d65d7643ee7eb60b03a23f1f5dff002daaacf4ae479954df1e3d33fd2b593599628d89b0071d5fae9d3bc5750b8a3f1ae3cc9cd3031b4789c689236ce568de374af543ab21b51b2b03138208076a3cef4c8b935acaf3bb05c12685036e285e550b3bccf8a41c7b2327ce78c9a6188b917b2995ab20676a8102af6dc76624c680011f9d8f0005095da5b491ccaec303f0d4f292ebba01cecf23cc57ffd9>)
  /ASCIIHexDecode
  filter             % ascii to bytes
  0 dict
  /DCTDecode         % jpg to explicit
  filter

上面的代码片段替换了@Hath995答案中的(myJPEG500x133.jpg) (r) file /DCTDecode filter,这对编程非常有帮助。


如果你想要除了JPEG以外的RGB格式(即:你需要一些postscript没有解码器的格式),并且可以使用Python来准备你的postscript文件,你可以像下面这样使用PIL(它会忽略透明度字节,在postscript中是一个打开/关闭操作):
import PIL.Image
i = PIL.Image.open("/tmp/from-template.png")
import itertools
''.join(["%02x" % g 
         for g in itertools.chain.from_iterable(
                    k[:3] for k in i.getdata())])

对于索引文件,我不确定,但是解决起来肯定不难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接