如何使用 hsb 颜色模型制作正确的阴影?

如何使用 hsb 颜色模型制作正确的阴影?

我想使用 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。

相关内容