假设我画两个半透明的矩形:
- 红色较大的一个位于主层
- 绿色较小的一个位于后层
其中“红色”是真实颜色,“绿色”是混合颜色。换句话说,“绿色”是我想看到什么。如果我设置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}
在 中xcolor
,red!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}