如何将 CMYK (tiff) 文件转换为 postscript 文件?

How do I convert CMYK (tiff) file in postscript file?

出于测试目的,我想从 Tiff 文件创建一个 postscript 文件。图片是CMYK模式,不想转成RGB。

我在 Windows,并使用 Ghostscript 查看 postscript 文件。我尝试使用 colorimage 运算符从十六进制编码的图片中绘制彩色图像。


3508 2480 scale
3508 2480 8 [3508 0 0 -2480 0 2480]
{currentfile 4 3508 mul string readhexstring pop} bind
false 4 colorimage
49492a00080000001200fe00040001000000000000000001030001000000

-- More Hex Data --

我希望它能用 ghostscript 编译,但它 return 一个我无法理解的错误。

Error: /undefined in ??3
Operand stack:

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--
  --nostringval--   --nostringval--   false   1   %stopped_push   2045   1   3   %oparray_pop   2044   1   3   %oparray_
pop   2025   1   3   %oparray_pop   1884   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostr
ingval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--
Dictionary stack:
   --dict:973/1684(ro)(G)--   --dict:0/20(G)--   --dict:78/200(L)--
Current allocation mode is local
Current file position is 4
GPL Ghostscript 9.26: Unrecoverable error, exit code 1


编辑: 所以我成功地提取了一个小图像的原始二进制数据进行测试,多亏了 photoshop,我想用每种颜色的每个数据源创建图像,所以一个源用于青色,一个源用于洋红色,......我得到了这个文件:

/cyan { 
zz!!*'!s8W-!s8W-!zz!!*'!s8W-!s8W-!zz!!*'!s8W-!s8W-!zz!!*'!s8W-!s8W-!
  -- More Data --
} /ASCII85Decode filter def

/magenta {
s8W-!s8W-!s8N'!zzs8W-!s8W-!s8N'!zzs8W-!s8W-!s8N'!zzs8W-!s8W-!s8N'!
  -- More Data --
} /ASCII85Decode filter def

/yellow {
s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
  --More Data--
} /ASCII85Decode filter def

/black{
s8W-!s8W-!s8N'!zzs8W-!s8W-!s8N'!zzs8W-!s8W-!s8N'!zzs8W-!s8W-!s8N'!
  --More Data--
} /ASCII85Decode filter def

/DeviceCMYK setcolorspace

20 20 8 [20 0 0 20 0 0]
cyan
magenta
yellow
black
true 4 colorimage

如果你想要完整的代码来测试它:https://pastebin.com/6MFtw0M0

但是 Ghostscript 一直 return 给我一个神秘的错误 :

Error: /undefined in --colorimage--
Operand stack:

Execution stack:
   %interp_exit   .runexec2   --nostringval--   colorimage   --nostringval--   2   %stopped_push   --nostringval--   col
orimage   colorimage   false   1   %stopped_push   2045   1   3   %oparray_pop   2044   1   3   %oparray_pop   2025   1
  3   %oparray_pop   1884   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   colo
rimage   --nostringval--   2   %stopped_push   --nostringval--   1913   10   3   %oparray_pop
Dictionary stack:
   --dict:973/1684(ro)(G)--   --dict:0/20(G)--   --dict:82/200(L)--
Current allocation mode is local
GPL Ghostscript 9.26: Unrecoverable error, exit code 1

编辑2: 所以我的文件数据不正确我尝试使用不同的文件并且它有效!

由于您没有(也不能)post 此处的整个程序,因此无法准确告诉您哪里出了问题。据推测,您计算的字节数不正确,因此 Ghostscript 太早(并尝试解释图像数据)或太晚开始解释,无法理解损坏的内容。

很可能(从错误中)它试图解释图像数据,它试图告诉您二进制值 0x03 未定义为运算符或过程或名称。

这很可能是因为您刚刚直接从TIFF文件中读取数据并将其存储到数据流中。你不能那样做,TIFF 是一种文件格式,它有一个 header 和标签,并且数据可能会被压缩。 colorimage 运算符期望您 提供图像组件。

您需要在提交数据之前剥离 header 和标签,可能解压数据流,处理偏移量等。

This answer 在 Google 组中有一个 link,其中包含我前段时间编写的用于读取 TIFF 文件的 PostScript 程序。老实说,我不记得它是否会读取 CMYK TIFF 文件,但至少它会给你一些关于正在发生的事情的线索。我确信可以修改程序以读取 CMYK TIFF 文件(如果它还没有这样做的话)。

您可以使用 ps2write 设备通过 Ghostscript 运行 该程序(将其指向您的 TIFF 文件),它会生成一个包含 CMYK 图像的 PostScript 文件。

否则,您可以自己将图像组件提取为原始二进制数据,然后使用现有的 PostScript 将其包装起来。