Mac/Linux 构建之间的 ImageMagick 不一致行为 CMYK 文件在 Linux 上损坏

问题描述

我正在将 PDF 批量转换为 TIFF 图像。

bash 脚本在 Mac 上编写和测试,然后推送到 Ubuntu 机器进行生产运行。 (它有更好的规格)

奇怪的是,某些页面(大约 100 个)导出的图像已损坏。 多次运行后,图像损坏发生在同一页面上, 暗示这不是随机的运行时错误

页面使用相同的 PDF/X4 配置文件从 Adob​​e InDesign CC2020 导出。 所有这些都遵循具有样式的类似文本组合,放置在单色图像上。

左:正确/右:损坏

comparison of original/corrupt images

为了完整起见,我尝试了 im6(认为 ubuntu20.4)转换命令,但结果相同。

这是我运行批处理的选项(通过 GNU Parallel)。 在我的脚本中,我可能做错了什么吗?

    convert \
        -verbose \
        -alpha off \
        -colorspace Gray \
        -contrast-stretch 0 \
        -depth 8 \
        -compress zip \
        -units PixelsPerInch \
        -density 1200  \
        ${1} \
        ${1%.*}.tiff

通过搜索我发现 im6 和 im7 之间以及它们如何处理颜色配置文件之间可能存在问题,但它们的版本匹配如下:

magick --version 所示的版本:

Mac (homebrew):
Version: ImageMagick 7.0.11-14 Q16 x86_64 2021-05-31 https://imagemagick.org
copyright: (C) 1999-2021 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.PHP
Features: Cipher DPC HDRI Modules OpenMP(5.0)
Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg lcms lqr ltdl lzma openexr png ps tiff webp xml zlib

Ubuntu20.04 (v7 installed with https://github.com/SoftCreatR/imei/ )
Version: ImageMagick 7.0.11-14 Q32 x86_64 2021-05-17 https://imagemagick.org
copyright: (C) 1999-2021 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.PHP
Features: Cipher DPC HDRI Modules OpenMP(4.5)
Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib gvc heic jbig jng jp2 jpeg jxl lcms lqr ltdl lzma openexr pangocairo png ps raqm raw rsvg tiff webp wmf x xml zip zlib

这里是从 PDF 文件中识别命令结果:

识别结果:存在导出问题的 PDF 文件

Image:
  Filename: 05.pdf
  Format: PDF (Portable Document Format)
  Mime type: application/pdf
  Class: DirectClass
  Geometry: 380x533+0+0
  Resolution: 72x72
  Print size: 5.27778x7.40278
  Units: Undefined
  Colorspace: CMYK
  Type: ColorSeparation
  Endianness: Undefined
  Depth: 16/8-bit
  Channel depth:
    Cyan: 1-bit
    magenta: 1-bit
    Yellow: 1-bit
    Black: 8-bit

识别结果:PDF文件没有问题:

Image:
  Filename: 06.pdf
  Format: PDF (Portable Document Format)
  Mime type: application/pdf
  Class: DirectClass
  Geometry: 380x533+0+0
  Resolution: 72x72
  Print size: 5.27778x7.40278
  Units: Undefined
  Colorspace: sRGB
  Type: Palettealpha
  Base type: Undefined
  Endianness: Undefined
  Depth: 16/8-bit
  Channel depth:
    Red: 8-bit
    Green: 8-bit
    Blue: 8-bit
    Alpha: 8-bit

我注意到 CMYK 色彩空间中的文件似乎有问题,而不是 sRGB。

然而,这对我来说并不能解释为什么它可以在 Mac 上运行,而不能在 Ubuntu 上运行。

也许是 Ubuntu 构建,包含与 Mac 构建不同的 CMYK 库? 有没有办法证实我的怀疑?

解决方法

我可能已经找到了解决办法。

问题似乎出自这一部分:

  Channel depth:
    Cyan: 1-bit
    Magenta: 1-bit
    Yellow: 1-bit
    Black: 8-bit

原始图像用于单色打印。 这样CMY除了K之外的所有通道都没有数据,存储为1的位深。

尚不清楚为什么它可以在 Mac 上运行,但这里有一个也适用于 Linux 构建的版本:

    convert \
        -verbose \
        -alpha off \
        -colorspace CMYK \
        -contrast-stretch 0 \
        -depth 8 \
        -channel black -negate -separate \
        -compress zip \
        -units PixelsPerInch \
        -density 1200  \
        ${1} \
        ${1%.*}.tiff

关键是首先用 CMYK 渲染,因为原始 PDF 是用于的。

然后剥离 CMY 通道,以创建纯灰度图像。 (注意K通道需要否定)

上面的代码段在 Mac/Linux 上都能正常工作。