我想使用 hsb 颜色模型进行阴影处理。
第一个矩形显示使用 rgb 颜色模型的阴影。
第二个矩形显示使用 hsb 颜色模型的阴影。但我不明白为什么我没有获得与第三个矩形相同的阴影。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
% create some hsb colors
\colorlet{redhsb}[hsb]{red}%
\colorlet{bluehsb}[hsb]{blue}%
\colorlet{greenhsb}[hsb]{green}%
% first shading with rgb color model
\fill[left color=red,right color=blue] (0,1) rectangle (2,0);
% second shading with hsb color model
\fill[left color=redhsb,right color=bluehsb] (0,0) rectangle (2,-1);
% third shading with hsb color model
\fill[left color=redhsb,right color=greenhsb] (0,-1) rectangle (1,-2);
\fill[left color=greenhsb,right color=bluehsb] (1,-1) rectangle (2,-2);
\end{tikzpicture}
\end{document}
编辑:实际上,TikZ 会计算中间颜色(使用左侧颜色的颜色模型)。然后,它将所有三种颜色转换为 rgb 模型并进行着色...
我添加了第四个矩形:
% fourth shading with rgb color model
\fill[left color=red,right color=green] (0,-2) rectangle ++(1,-1);
\fill[left color=green,right color=blue] (1,-2) rectangle ++(1,-1);
所以,我的问题是:TikZ 可以进行真正的 hsb(HSV)着色吗?
答案1
当你这样做时,会发生以下情况\fill[left color=redhsb,right color=bluehsb] (0,0) rectangle (2,-1);
TikZ 设置了三种内部颜色:
tikz@axis@bottom=bluehsb
tikz@axis@middle=redhsb!50!bluehsb
tikz@axis@top=redhsb
中间颜色由 计算
xcolor
,它在第一个颜色模型(在本例中为 HSB)中进行混合。TikZ 使用由以下声明的阴影
\pgfdeclareverticalshading[tikz@axis@top,tikz@axis@middle,tikz@axis@bottom]{axis}{100bp}{% color(0bp)=(tikz@axis@bottom); color(25bp)=(tikz@axis@bottom); color(50bp)=(tikz@axis@middle); color(75bp)=(tikz@axis@top); color(100bp)=(tikz@axis@top)}
pgf 基本上将其传递给
\pgfsys@vertshading
。此命令的定义取决于输出驱动器。对于 PDF,它是
\def\pgfsys@vertshading#1#2#3{% {% \pgf@parsefunc{#3}% \pgfmathparse{#2}% \setbox\pgfutil@tempboxa=\hbox to\pgfmathresult pt{\vbox to\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}% \pgf@process{\pgfpoint{#2}{\pgf@max}}% \pdfxform resources {% /Shading << /Sh << /ShadingType 2 /ColorSpace /DeviceRGB /Domain [\pgf@pdfparseddomain] /Coords [0 \pgf@doma\space0 \pgf@domb] /Function \pgf@pdfparsedfunction /Extend [false false] >> >>}\pgfutil@tempboxa% << \expandafter\xdef\csname @pgfshading#1!\endcsname{\leavevmode\noexpand\pdfrefxform\the\pdflastxform}% }% }
我不会假装了解所有正在发生的事情,但据我所知,pgf 仅写入 3 种计算出的颜色并告诉 PDF 查看器通过线性插值进行着色。换句话说,TikZ 似乎不会自行进行着色计算。
如上所示,颜色空间设置为DeviceRGB
。事实上,我认为 PDF 不支持 HSL(尽管我还没有查看 PDF 文档)。
据我所知,获取 HSL 插值的唯一方法是编写一个 PostScript 着色器进行插值,然后将结果转换为 RGB。