我有一张 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
,,,,,,每个都有参数。cs
SC
sc
SCN
scn
对于单色黑色图像,我期望0 g
和0 G
靠近流的开头。上面的示例包含两个操作:0 g 0 G
。
如果 PDF 文件被编辑伟大的需要注意的是,对象的大小不会改变。首先,在条目中给出流的长度/Length
。并且对象的文件偏移量写入xref
PDF 文件的表中。因此,颜色操作通过覆盖被删除。此外,编辑器不应通过更改行尾字符等方式进行自己的编辑。
如果颜色操作单独占一行,那么只需用百分比字符替换第一个字符即可,这也是 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。我的第一选择pdftops
是xpdf
:
pdftops -eps myimage.pdf myimage.eps
它使用与 PDF 文件中相同的运算符名称。如果pdftops
页面在之后开始%%EndSetup
(以 开始pdfStartPage
)。PostScript 是一种编程语言,通常很难找到颜色运算符:setgray
、setrgbcolor
、setcmykcolor
。如果pdftops
,则定义新的运算符,其名称与 PDF 运算符相同。因此,可以按照上一节中所述进行操作。但是,文件的大小很容易改变,行尾也不太重要,并且可以插入新的颜色操作。
然后将文件重新转换为 PDF,例如:
ps2pdf myimage.eps myimage-changedcolors.pdf
如果以后使用不同于 pdfTeX/LuaTeX 的驱动程序,始终确保黑色是默认颜色,也可以使用此方法。然后在 PostScript 文件中更改颜色。
答案2
编辑:一个更简单(并且可能更好)的版本来解释细节。
TikZfadings
库允许使用图片作为蒙版。在这里,您的图片就是蒙版(淡入淡出)。
给定任何褪色点,该点的透明度由褪色图片在相同位置的亮度决定。点的亮度决定了该点的“亮度”。褪色图片中的点越亮,褪色中的点就越不透明。具体来说,褪色图片的白点在褪色中完全不透明,褪色图片的黑点在褪色中完全透明。(pgfmanual-“褪色”部分)
以下示例中有三个步骤:
- 创建淡入淡出(带有名称
border41
)。 - 用红色填充区域。
- 用黄色填充相同的区域但使用
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}