如何使 cmyk 颜色与 dvisvgm 配合使用?

如何使 cmyk 颜色与 dvisvgm 配合使用?

我有一个这样的 tex 文件:

\documentclass{standalone}
\usepackage[cmyk]{xcolor}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
    \fill[green] circle (3);
\end{tikzpicture}

\end{document}

我使用 pdflatex 对其进行编译,然后使用 pdf2svg 将其转换为 svg,得到如下结果:

pdf转svg

我现在正尝试使用 dvisvgm 实现相同的结果。

我有一个这样的 tex 文件:

\documentclass[dvisvgm]{standalone}
\usepackage[cmyk]{xcolor}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
    \fill[green] circle (3);
\end{tikzpicture}

\end{document}

我使用 编译它latex test2.tex,然后使用 将其转换为 svg dvisvgm test2.dvi。然而结果如下所示:

韋斯維爾

在我看来,即使我在加载包时指定了 cmyk,当使用 dvisvgm 路线时颜色仍被视为 rgb xcolor

有没有办法我可以通过 dvisvgm 路由编译文件并获得与上面的 pdf2svg 版本类似的颜色?

答案1

由于 SVG 本身不支持 CMYK 颜色,因此生成 SVG 文件的程序必须将它们转换为 RGB。这通常使用一个简单的公式来完成,该公式将颜色粗略地映射到 RGB 颜色空间,例如绿色到绿色、红色到红色、黄色到黄色等,但它没有考虑实际的色调、色调、阴影等。实际上,这是一个相当复杂的主题,需要颜色管理系统 (CMS) 和 ICC 颜色配置文件才能正确处理颜色映射。因此,目前,无法直接从 CMYK 值中获取与 PDF 查看器或 生成的相同颜色pdf2svg
编辑:作为版本 3.3,dvisvgm 从 CMYK 颜色创建类似于 Ghostscript 的 RGB 颜色。

dvisvgm 不使用 CMS 在颜色空间之间进行转换。我也不愿意依赖它,因为很难维持对另一个第三方库的依赖,比如小型 CMS。虽然 Windows 内置有 CMS,但其他操作系统却没有,因此需要一种可移植的解决方案。

但是,使用 CMYK 颜色时,还有其他方法可以获得更令人满意的视觉效果。在尝试了几种方法后,我找到了两种比较容易实现的技术,可能会在下一个 dvisvgm 版本中提供。

第一个是基于我在 主题。它产生了很好的效果,颜色比 Ghostscript 或各种 PDF 查看器创建的颜色稍暗一些。

以下是 Ghostscript 创建的结果(左)、提到的公式(中)以及 dvisvgm 当前使用的转换的比较:

Ghostscript 近似 默认 CMYK 到 RGB 转换

第二种方法是使用预先计算的 RGB 颜色表,其中包含一定数量的 CMYK 颜色,并从中插入所有其他值。根据我的测试,625 个样本值(即每个 CMYK 维度 5 个样本)导致的结果很难与 PDF 查看器创建的结果区分开来 - 至少在我看来是这样。

Ghostscript(左)和线性插值创建的结果:

Ghostscript 插值

虽然第一种方法速度快且非常容易实现,但第二种方法可以产生更好的匹配结果。比较两种方法的结果,感知颜色之间的差异(使用 deltaE,CIEDE2000)介于 2 到 10 之间,这还不算太糟糕。以下是上述渐变示例的差异可视化(颜色越深表示差异越大):

增量E

相关内容