为黑白 PDF 图形着色

为黑白 PDF 图形着色

我有一张 PDF 格式的图形(最初是从 SVG 转换而来),它是单色的(白底黑字)。是否可以使用 TikZ 或 PSTricks 而不是 Illustrator 或 Inkscape 来为该图像添加不同的颜色?

例子

在此处输入图片描述

在它持续期间(似乎没有长期托管 pdf 的方法),你可以下载以上图片为 PDF

编辑:简单可能有点用词不当——pdf 被裁剪了,而且是单色的,但要自己重新绘制却太复杂了。上面的例子是字体中的一个字符(我我不太清楚如何重新着色,但它很好地说明了我所谈论的形状。

答案1

不含颜色运算符的 PDF

如果您很幸运并且 PDF 图像不包含任何颜色运算符并且您正在使用 pdfTeX/LuaTeX,那么一个简单的\textcolor方法就可以了:

\textcolor{red}{\includegraphics{myimage.pdf}}

带颜色运算符的 PDF

可以从 PDF 文件中识别并删除颜色运算符。通常页面内容流是压缩的。pdftk可以解压缩它们:

pdftk myimage.pdf output temp.pdf uncompress

然后你需要找到页面对象。查找/Page(不是/Pages),例如:

4 0 obj <<
/Type /Page
/Contents 5 0 R
/Resources 3 0 R
/MediaBox [0 0 595.276 841.89]
/Parent 7 0 R
>> endobj

然后后面的数字/Contents是页面内容流的对象编号。在本例中,该数字是5,我们搜索5 0 obj

5 0 obj <<
/Length 254       
>>
stream
0 g 0 G
1 0 0 1 14.944 500.863 cm
q
10 0 0 10 0 0 cm
...
endstream

现在我们在stream和之间有 254 个字节endstream来扫描颜色运算符。运算符跟在操作数后面(后缀表示法)。主要颜色运算符(<n>是 0 到 1 之间的数字):

  • <n> G<n> g针对灰度模型
  • <n> <n> <n> RG<n> <n> <n> rg针对 RGB 颜色模型
  • <n> <n> <n> <n> K<n> <n> <n> <n> k针对 CMYK 颜色模型
  • 其他还有CS,,,,,,每个都有参数。csSCscSCNscn

对于单色黑色图像,我期望0 g0 G靠近流的开头。上面的示例包含两个操作:0 g 0 G

如果 PDF 文件被编辑伟大的需要注意的是,对象的大小不会改变。首先,在条目中给出流的长度/Length。并且对象的文件偏移量写入xrefPDF 文件的表中。因此,颜色操作通过覆盖被删除。此外,编辑器不应通过更改行尾字符等方式进行自己的编辑。

如果颜色操作单独占一行,那么只需用百分比字符替换第一个字符即可,这也是 PostScript 和 PDF 中的注释字符,如上例所示:

% g 0 G

或者用空格覆盖条目(     ,字符代码为 32 的普通空格)。

文件被重新压缩:

pdftk temp.pdf output myimage-colorless.pdf compress

使用 pdfTeX 的技巧将会奏效:

\textcolor{red}{\includegraphics{myimage-colorless.pdf}}

通过 PostScript 对颜色操作进行低级编辑

如果直接编辑 PDF 文件比较困难(压缩、大小要求、编辑器要求、添加颜色等),则可以将 PDF 转换为 PostScript。我的第一选择pdftopsxpdf

pdftops -eps myimage.pdf myimage.eps

它使用与 PDF 文件中相同的运算符名称。如果pdftops页面在之后开始%%EndSetup(以 开始pdfStartPage)。PostScript 是一种编程语言,通常很难找到颜色运算符:setgraysetrgbcolorsetcmykcolor。如果pdftops,则定义新的运算符,其名称与 PDF 运算符相同。因此,可以按照上一节中所述进行操作。但是,文件的大小很容易改变,行尾也不太重要,并且可以插入新的颜色操作。

然后将文件重新转换为 PDF,例如:

ps2pdf myimage.eps myimage-changedcolors.pdf

如果以后使用不同于 pdfTeX/LuaTeX 的驱动程序,始终确保黑色是默认颜色,也可以使用此方法。然后在 PostScript 文件中更改颜色。

答案2

编辑:一个更简单(并且可能更好)的版本来解释细节。

TikZfadings库允许使用图片作为蒙版。在这里,您的图片就是蒙版(淡入淡出)。

给定任何褪色点,该点的透明度由褪色图片在相同位置的亮度决定。点的亮度决定了该点的“亮度”。褪色图片中的点越亮,褪色中的点就越不透明。具体来说,褪色图片的白点在褪色中完全不透明,褪色图片的黑点在褪色中完全透明。(pgfmanual-“褪色”部分

以下示例中有三个步骤:

  1. 创建淡入淡出(带有名称border41)。
  2. 用红色填充区域。
  3. 用黄色填充相同的区域但使用border41褪色作为蒙版。

结果:

在此处输入图片描述

底部的红线是抗锯齿的产物。请参见TikZ 边框不应该显示出来(重叠的圆圈)

代码(带注释):

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fadings}

% use border_41.pdf to make a fading (a mask)
\begin{tikzfadingfrompicture}[name=border41,inner sep=0]
  \node [fill=transparent!0]
  {\includegraphics[width=43mm,height=32.8mm]{border_41}};
\end{tikzfadingfrompicture}

\begin{document}
\begin{tikzpicture}[inner sep=0]
  % fill a region with red
  \node[fill=red,minimum width=43mm,minimum height=32.8mm](a){};
  % fill the same region with yellow but using a fading as mask
  \path[scope fading=border41,fit fading=false];
  \node[fill=yellow,minimum width=43mm,minimum height=32.8mm]{};
\end{tikzpicture}
\end{document}

第一个答案:这是一个使用的解决方案tikzfadingfrompicture

在此处输入图片描述

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fadings}

\begin{tikzfadingfrompicture}[name=tikz]
  \node [fill=transparent!0,draw=none]
  {\includegraphics[width=43mm,height=32.8mm]{border_41}};
\end{tikzfadingfrompicture}

\begin{document}
\begin{tikzpicture}
  \node[left color=red,right color=yellow,minimum width=43mm,minimum height=32.8mm]{};
  \path[scope fading=tikz,fit fading=false];
  \node[fill=gray,minimum width=43mm+1mm,minimum height=32.8mm+1mm]{};
\end{tikzpicture}
\end{document}

相关内容