如何在后记文件中转换CMYK(tiff)文件?

时间:2019-04-03 12:29:20

标签: postscript cmyk

出于测试目的,我想从Tiff文件创建一个Postscript文件。图像处于CMYK模式,我不想将其转换为RGB。

我在Windows上,并使用Ghostscript查看后记文件。我尝试使用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一起编译,但是它返回一个我无法理解的错误。

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不断向我返回一个神秘错误:

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

EDIT2: 因此,我的文件数据不正确,我尝试使用其他文件,并且可以正常工作!

1 个答案:

答案 0 :(得分:0)

由于您没有(也不能)在此处发布整个程序,因此无法确切告诉您出了什么问题。猜测是您错误地计算了字节数,因此Ghostscript进行解释的时间太早(尝试解释图像数据)或太晚而无法理解损坏的内容。

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

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

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

This answer包含一个指向Google组的链接,该组具有我之前编写的PostScript程序,用于读取TIFF文件。老实说,我无法回忆起它是否会读取CMYK TIFF文件,但至少会为您提供一些有关发生情况的线索。我确定该程序可以修改为读取CMYK TIFF文件(如果尚未这样做的话)。

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

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