Image 在postscript中添加图像的简单方法

Image 在postscript中添加图像的简单方法,image,postscript,Image,Postscript,我正试图用postscript写一份文件 到目前为止,我已经能够写简单的文字,并与线和形状的工作 我现在正在尝试向文档中添加一些图像。在网上搜索之后,我似乎找不到任何明确的方法来做到这一点 下面的剪报是一个hello world: %!PS /Times 20 selectfont 20 800 moveto (Hello World!) show showpage 我只想通过指定x和y坐标插入一个图像(例如PNG、JPG、G

我正试图用postscript写一份文件

到目前为止,我已经能够写简单的文字,并与线和形状的工作

我现在正在尝试向文档中添加一些图像。在网上搜索之后,我似乎找不到任何明确的方法来做到这一点

下面的剪报是一个hello world:

%!PS
/Times               
20 selectfont         
20 800 moveto         
(Hello World!) show
showpage 
我只想通过指定x和y坐标插入一个图像(例如PNG、JPG、GIF)


任何帮助都将不胜感激。

您可以从adobe下载(这是postscript的“圣经书”)。第4.10章图像将是一个很好的起点。

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

有一个简单的方法,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

这是迟到的回答吗!
-dNOSAFER
的问题使我无法使用其他解决方案,因此我采取了以下措施:

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

(ffd8ffe000104a46494600010102002700270000ffdb004300030202020202030202020303030304060404040404080606050609080a0a090809090a0c0f0c0a0b0e0b09090d110d0e0f101011100a0c12131210130f101010ffdb00430103030304030408040408100b090b1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010ffc00011080010001003011100021101031101ffc400160001010100000000000000000000000000060507ffc40026100002020201030207000000000000000001020304051106071221001315163132414252ffc400160101010100000000000000000000000000070403ffc4002911000201030105090100000000000000000102030004210711123151531314324142617381d1d3ffda000c03010002110311003f00de311d00e0478be19acddc79b0f8ba734aef8aa8a59a4af1c9bdc96159beef275e4efd1ccfa5f2aceea2f8e09f41e7f252a47ab4c4093ba71ceced387b7828b724e87705b588c8478ecac114e28d89e36f83d65d7643ee7eb60b03a23f1f5dff002daaacf4ae479954df1e3d33fd2b593599628d89b0071d5fae9d3bc5750b8a3f1ae3cc9cd3031b4789c689236ce568de374af543ab21b51b2b03138208076a3cef4c8b935acaf3bb05c12685036e285e550b3bccf8a41c7b2327ce78c9a6188b917b2995ab20676a8102af6dc76624c680011f9d8f0005095da5b491ccaec303f0d4f292ebba01cecf23cc57ffd9>)
  /ASCIIHexDecode
  filter             % ascii to bytes
  0 dict
  /DCTDecode         % jpg to explicit
  filter
'.join([%02x”%ord(c)表示c处于打开状态(文件名为“rb”).read())

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

(ffd8ffe000104a46494600010102002700270000ffdb004300030202020202030202020303030304060404040404080606050609080a0a090809090a0c0f0c0a0b0e0b09090d110d0e0f101011100a0c12131210130f101010ffdb00430103030304030408040408100b090b1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010ffc00011080010001003011100021101031101ffc400160001010100000000000000000000000000060507ffc40026100002020201030207000000000000000001020304051106071221001315163132414252ffc400160101010100000000000000000000000000070403ffc4002911000201030105090100000000000000000102030004210711123151531314324142617381d1d3ffda000c03010002110311003f00de311d00e0478be19acddc79b0f8ba734aef8aa8a59a4af1c9bdc96159beef275e4efd1ccfa5f2aceea2f8e09f41e7f252a47ab4c4093ba71ceced387b7828b724e87705b588c8478ecac114e28d89e36f83d65d7643ee7eb60b03a23f1f5dff002daaacf4ae479954df1e3d33fd2b593599628d89b0071d5fae9d3bc5750b8a3f1ae3cc9cd3031b4789c689236ce568de374af543ab21b51b2b03138208076a3cef4c8b935acaf3bb05c12685036e285e550b3bccf8a41c7b2327ce78c9a6188b917b2995ab20676a8102af6dc76624c680011f9d8f0005095da5b491ccaec303f0d4f292ebba01cecf23cc57ffd9>)
  /ASCIIHexDecode
  filter             % ascii to bytes
  0 dict
  /DCTDecode         % jpg to explicit
  filter
上面的代码片段替换了@Hath995答案中非常有用的
(myJPEG500x133.jpg)(r)文件/DCTDecode filter


如果您想要的不是JPEG,但仍然是RGB(即:您想要的是postscript没有解码器的内容),并且您可以使用Python来准备postscript文件,您可以使用PIL,如下所示(它忽略透明度字节,这是postscript中的开/关操作):


对于索引文件,我不知道,但解决它并不困难。

pnmtops生成的代码可能更容易理解。有关直接位图,请参阅。转换为.xbm非常方便,但是。postscript无法直接读取这些格式,但请参阅下面的@lhf answer。如果您想直接添加图像,请检查我的答案,如何使其成为一个过程(文件名、x、y、wid、ht)?它还可能需要一个额外的参数来指定哪个角应该位于(x,y)处。如果您正在进行快速而肮脏的排版,则左上角的排版更容易处理。它可以放在一个过程中,但上面的大多数代码只是按照colorimage命令的正确顺序将数据放入堆栈中。左下角实际上不是一个选项,它是由postscript定义的。Postscript将0,0定义为页面的左下角,因此如果您理解我的要点,Postscript本机方法也以左下角为中心。你可以选择将x,y定义为左上角,但是你的函数基本上必须转换为左下角的坐标。是的,我不是在抱怨什么。但是考虑提问者的水平…事实上,我把一切都收回了!这样做将是一个完美的练习。你已经付出了一切!