为什么 xcolor 混合后颜色会变浅

为什么 xcolor 混合后颜色会变浅

我试图在青色和蓝色之间创建一个平滑的渐变,连接两个形状,一个用青色绘制,一个用蓝色绘制。为此,我使用循环中两种颜色的简单混合\foreach

然而,在混合的第一步中,尽管只有 0.5% 的蓝色与(大概)99.5% 的青色混合,但产生的颜色与纯青色有很大不同。

我遗漏了什么,如何才能正确实现效果?要清楚:应该混合哪些颜色和以何种比例混合才能实现从纯青色到纯蓝色的第一步?

梅威瑟:

\documentclass[tikz]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
    \draw[cyan,fill=cyan] (0,0) rectangle (1,1);
    \draw[blue!0.5!cyan,fill=blue!0.5!cyan] (1,0) rectangle (2,1);
\end{tikzpicture}
\end{document}

输出:

颜色混合示例

以下是使用过程中出现的问题\shade

\documentclass[tikz]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \shade[left color=blue,right color=cyan] (0,0) rectangle (2,1);
  \draw[cyan,fill=cyan] (2,0) rectangle (3,1);
\end{tikzpicture}
\end{document}

结果:

使用遮阳时的问题

该问题已由@PaulGaborit 和@percusse 解决,如下面的评论所示,通过设置:

\colorlet{cyan}[rgb]{cyan}

如果我理解正确的话,xcolor 根据混合中第一种颜色的默认方案决定使用哪种配色方案 (rgb/cym),并使用第一种配色方案下第二种颜色的预定义名称 (在本例中为“青色”)。因此,当使用不同方案的基本颜色时,混合的较高边界 (当第二种颜色占主导地位时) 可能与默认的“纯”色不同。

回想起来,xcolor 手册(V2.11)第 15 页第 2.3.2 节暗示了这种情况发生。

答案1

xcolor包将其定义blue为 RGB 颜色和cyanCMY 颜色。

为了进行混合,xcolor使用第一种颜色的颜色模型,并且如果需要,转换第二种颜色。

要将 CMY 转换cyan为 RGB cyan,您可以\colorlet{cyan}[rgb]{cyan}在序言中添加。

\documentclass[tikz]{standalone}
\usepackage{tikz}
\colorlet{cyan}[rgb]{cyan}
\begin{document}
\begin{tikzpicture}
    \draw[cyan,fill=cyan] (0,0) rectangle (1,1);
    \draw[blue!0.5!cyan,fill=blue!0.5!cyan] (1,0) rectangle (2,1);
\end{tikzpicture}
\end{document}

摘自xcolor手册(第 2.3.2 节“标准颜色表达的含义”,第 15 页,v2.11):

一般来说,第二种颜色会转换为第一种颜色的模型,然后在该模型内计算混合。因此, 理论上应该是等价的,name1!<percent>!name2name2!<100-percent>!name1不一定会产生相同的视觉效果。

这是一个包含三行的示例:默认模型、纯 rgb 模型和纯 cmy 模型。

在此处输入图片描述

\documentclass[tikz,margin=1mm]{standalone}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{positioning}

\colorlet{cmycyan}{cyan}
\colorlet{rgbcyan}[rgb]{cyan}

\colorlet{cmyblue}[cmy]{blue}
\colorlet{rgbblue}{blue}

\begin{document}
\begin{tikzpicture}
  \tikzset{
    block/.style 2 args={
      draw,right=-.5\pgflinewidth of a,
      fill=#1,text=#2,
      text height=.8em,text depth=.2em,text width=3.5cm,
      font=\ttfamily\bfseries,align=center,
    },
  }
  \node[anchor=base east] (a) {default models};
  \foreach \col/\txtcol in {blue/white,blue!1!cyan/black,cyan!99!blue/white,cyan/white}{
    \node[block={\col}{\txtcol}](a){\col};
  }

  \node[anchor=base east] (a) at (0,-1) {rgb model};
  \foreach \col/\txtcol in {rgbblue/white,rgbblue!1!rgbcyan/black,rgbcyan!99!rgbblue/black,rgbcyan/black}{
    \node[block={\col}{\txtcol}](a){\col};
  }

  \node[anchor=base east] (a) at (0,-2) {cmy model};
  \foreach \col/\txtcol in {cmyblue/white,cmyblue!1!cmycyan/white,cmycyan!99!cmyblue/white,cmycyan/white}{
    \node[block={\col}{\txtcol}](a){\col};
  }
\end{tikzpicture}
\end{document}

答案2

无需使用\colorlet。您也可以直接指定混合的颜色模型……但无论如何,男子气概的程序员只使用波长。:)

在此处输入图片描述

\documentclass{article}
\usepackage{xcolor}
\begin{document}
\colorbox{rgb:blue!1!cyan,1}{}
\colorbox{rgb:cyan!99!blue,1}{}
\colorbox[wave]{480}{}
\colorbox{cmy:blue!1!cyan,1}{}
\colorbox{cmy:cyan!99!blue,1}{}
\end{document}

答案3

我不知道这背后的细节,但blue!1!cyan与之不同cyan!99!blue

在此处输入图片描述

\documentclass[tikz]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
    \filldraw[blue!1!cyan] (0,0) rectangle (-1,1);
    \filldraw[cyan] (0,0) rectangle (1,1);
    \filldraw[cyan!99!blue] (1,0) rectangle (2,1);
\end{tikzpicture}
\end{document}

相关内容