无法将NCL高分辨率postscript转换为png

时间:2013-04-18 08:43:40

标签: imagemagick png postscript imagemagick-convert rhel5

我从NCL脚本获得了一个postscript文件,其中包括mpDataBaseVersion =" HighRes" (高分辨率地图)。我在RHEL 5.6 i386中运行了ImageMagick 6.2.8。

当我跑convert high-resolution.ps test.png时,我得到了:

Error: /undefinedresult in --ashow--

Operand stack:
   0   0   ( )

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1910   1   3   %oparray_pop   1909   1   3   %oparray_pop   1893   1   3   %oparray_pop   1787   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--

Dictionary stack:
   --dict:1171/1684(ro)(G)--   --dict:0/20(G)--   --dict:143/200(L)--

Current allocation mode is local
Current file position is 629039

但是相同的postscript在使用ImageMagick 5.5.6的RHEL 3 i386中无错误地转换,为什么会这样?

我用谷歌搜索了一段时间,但我仍然不知道在ashow错误中的不确定结果 什么是执行堆栈意味着什么?


[UPDATE]

谢谢,@ Free和@Ken!
我在下面重构了我的问题:

我有一个很大的PostScript文件(9.3 MB): high_resolution.ps

PC A:

  • 红帽企业Linux ES版本3(Taroon Update 3)i386
  • 转换版本:ImageMagick 5.5.6 04/01/03 Q16
  • Ghostscript版本:GNU Ghostscript 7.05(2002-04-22)

PC B:

  • 红帽企业Linux服务器版本5.6(Tikanga)i386
  • 转换版本:ImageMagick 6.2.8 05/07/12 Q16
  • Ghostscript版本:GPL Ghostscript 8.70(2009-07-31)

convert high_resolution.ps high_resolution.png 适用于PC A,但不适用于PC B.

错误在上面。
我检查了Ghostscript更改日志,我对此一无所知(也许我只是错过了它?)

非常感谢! 谢谢!

2 个答案:

答案 0 :(得分:1)

几乎可以肯定,您使用的是不同版本的Ghostscript(ImageMagick使用它来处理PostScript)。你在每个版本上安装了什么版本的Ghostscript?

Undefinedresult意味着它所说的,操作的结果是未定义的(这通常是由零除法引起的)。执行堆栈告诉您解释器遇到错误时执行堆栈上的内容。除非你理解Postscript(并且说实话,Ghostscript解释器)它不会告诉你任何有意义的东西。

如果没有看到导致错误的文件,我就不能再说了。请记住,PostScript是一种编程语言,因此错误消息只是一个起点。

更新

我已检索到该文件,并且我可以确认在通过当前版本的Ghostscript运行它时出现错误。 Adobe Acrobat Distiller提供了一个非常类似的错误(undefinedresult with setcachedevice),因此它几乎可以确定该文件是非法的。当我有机会确定原因时,我会说更多。

另外,这两个版本的Ghostscript都很老,当前版本是9.07

[更新2]

违规行非常接近文件的开头:

/ Helvetica 0 Fs 0 0()As Gr

由于PostScript是一种编程语言,因此该片段使用程序中定义的某些过程。它的作用是找到一个名为'Helvetica'的字体,将其缩放到0,然后显示字符串''将每个字形的宽度调整为0。

其中有几个部分显然是无稽之谈;将字体缩放为0将使其无用,最多字形将标记1个像素。使用运算符显示字符串以将每个字形的宽度调整为0显然毫无意义。更智能的软件不会产生这样的PostScript程序,但制作人显然对制作PostScript并不是很聪明,从文件的相当简单的序言可以看出。

基本上问题正是GS所说的,x和y宽度是通过使用矩阵来调整的,并且将矩阵乘法应用于字体大小为0的结果确实是未定义的。

您最好的选择可能是回到原始应用程序并删除导致文本''被发出的任何内容。

如果由于某种原因这是不可能的,你可以利用PostScript是一种编程语言这一事实​​,你可以自己重新定义/ ashow操作符,如果字体大小为0,它就不会做任何事情,例如:

/ old_ashow / ashow load def / ashow {currentfont / FontMatrix得到aload pop pstack 0 1 4 {pop add} for 0 eq {pop pop pop} {old_ashow} ifelse} bind def

通常情况下我会建议将它放在一个新文件中并在你要处理的文件之前通过Ghostscript运行它(例如'gs mod.ps high_resolution.ps')但是因为你使用的是ImagMagick你不能这样做那。因此,如果要执行此操作,则需要修改high_resolution.ps文件并将其放在文件的顶部。每当修改PostScript文件时,必须小心使用可以处理二进制文件的编辑器,并且不会改变CR / LF行结尾。

请注意,我不建议这样做,最好修复生成此PostScript程序的原始文件或脚本,以便您可以在其他地方使用它(例如打印)。目前它正在制作非法的PostScript。

为什么在(极端)旧版本的Ghostscript中不会发生错误;这几乎肯定是一种疏忽。 “Adobe Postscript语言参考手册”列出了每个运算符的可能错误,但并未列出引发错误的所有可能情况。很明显,这个错误条件是在7.05发布后添加的,几乎可以肯定的是当问题引起了开发人员的注意。

答案 1 :(得分:1)

ashow显示文字,为角色增加了额外的空间。堆栈0 0告诉系统为字符添加零额外空间。 ()是要显示的文本,它看起来是一个单独的空格,但是如果没有看到二进制的实际文件,它也可能是一个无法显示的字符。

如果字符是未定义的特殊字符,例如制表符或null,则undefinedresult将有意义。只有一个1字符的字符串可能也没有意义。

正如已经提到的那样,什么版本的ghostscript和看到实际文件会有所帮助。事后转储并不是特别有用,但执行堆栈看起来就像错误来自更复杂的上下文。