在半透明图形中设置正确的填充颜色

在半透明图形中设置正确的填充颜色

假设我画两个半透明的矩形:

  • 红色较大的一个位于主层
  • 绿色较小的一个位于后层

其中“红色”是真实颜色,“绿色”是混合颜色。换句话说,“绿色”是我想看到什么。如果我设置green,它将与“红色”混合并呈现接近“黄色”的颜色。

如果我想设置正确的填充颜色,就需要进行一些计算。效率太低了,每次我绘制一个嵌入另一个的半透明图形时,我都必须计算它应该的真实颜色!那么有没有什么简单的方法可以解决这个问题?

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \pgfdeclarelayer{back}
  \pgfsetlayers{back, main}
  \fill[red, fill opacity=0.3] (0, 0) rectangle (4, 4);
  \begin{pgfonlayer}{back}
    \fill[green, fill opacity=0.3] (1, 1) rectangle (3, 3);
  \end{pgfonlayer}
\end{tikzpicture}
\end{document}

在此处输入图片描述 在 中xcolorred!30!blue相当于0.3*red + 0.7*blue。如果我们透过不透明度为 0.3 的红色图层看蓝色的东西,我们看到的真实颜色是red!30!blue。我写了一些代码来验证它们。

\documentclass[border=2mm]{standalone}
\usepackage{xcolor}
\usepackage{tikz}
\definecolor{red1}{RGB}{255, 178, 178}
\definecolor{mix}{RGB}{201, 178, 125}
\tikzset{
  A/.style={rectangle, minimum height=1cm, minimum width=1cm, text opacity=1},
}
\begin{document}
\begin{tikzpicture}
  \pgfdeclarelayer{back}
  \pgfsetlayers{back, main}
  \node[A, fill=red, fill opacity=.3] at (0, 0) {red};
  \node[A, fill=red!30] at (1, 0) {red};
  \node[A, fill=red1] at (2, 0) {red1};
  \node[A, fill=red, fill opacity=.3] at (0, -1) {};
  \begin{pgfonlayer}{back}
    \node[A, fill=green, fill opacity=.3] at (0, -1) {real};
  \end{pgfonlayer}
  \node[A, fill=mix] at (1, -1) {calc};
\end{tikzpicture}
\end{document}

在此处输入图片描述

是的。那么,如果我透过不透明度为 0.3 的红色图层看,并且看到了一种green!30颜色,那么真正的颜色是什么,或者应该与哪种颜色混合才能red!30得到green!30?我解出了方程0.3*red + 0.7*unknow = 0.3*green + 0.7 * white,但结果(255, 255, 364)超出了范围。

为什么我没有把较小的矩形放在顶层?

因为需要。见下面的代码。主图层的右侧矩形的线被遮住了。

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \pgfdeclarelayer{back}
  \pgfsetlayers{back, main}
  \fill[draw, fill=red, fill opacity=0.3] (0, 0) rectangle (4, 4);
  \draw (0, 2) -- (4, 2);
  \begin{pgfonlayer}{back}
    \fill[green, fill opacity=0.3] (1, 1) rectangle (3, 3);
  \end{pgfonlayer}
  \begin{scope}[xshift=4cm]
    \fill[draw, fill=red, fill opacity=0.3] (0, 0) rectangle (4, 4);
    \draw (0, 2) -- (4, 2);
    \fill[green!30] (1, 1) rectangle (3, 3);
  \end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容