TiKz/PS 像素级混合

TiKz/PS 像素级混合

为了在 TiKz 中轻松进行适当的混合,我需要能够拥有一种特殊的混合模式。(这与处理图形而非 tiks/tex 的任何内容相关)

  • 当您绘制带有 alpha 通道的像素时,图形包或图形卡会将其下方的像素颜色与新颜色混合。例如,假设我们有 (100,0,0,255),并在其上方绘制 (50,50,0,50)。新像素将是 (100*(255 - 50)/255 + 50*50/255, 50*50/255, 0, 255) = (80, 10, 0, 255)。

  • 现在,当您有白色背景时,您最终总会将白色与初始像素混合。因此,如果您第一次使用 alpha 通道绘制任何像素,它将与白色混合并变得褪色。(255,255,255,255)与(255,0,0,50)混合 = (255,205,205,255)

  • 这是 tikz 和大多数使用 alpha 通道绘图的图形包的默认行为(只需混合像素)

  • 相反,我希望绘制第一种颜色不混合的位置。基本上,如果它是第一个要绘制的像素,那么它的 alpha 通道将始终设置为 255。这可以防止颜色褪色,并允许破坏其他颜色的复杂几何条件。

  • 有人知道 TiKz 是否可以做到这一点或可以修改来做到这一点吗?基本上,必须保留一个位缓冲区,其中每个位代表像素是否是第一次绘制的(有点像 z 缓冲区)。混合模式 - 此模式基本上是“将新像素的 Alpha 通道设置为 255”

  • 可以在 tikz 中对原始级别进行测试,但这不会得到部分重叠的对象。想象一下两个重叠但不完全重叠的圆。一个圆是“新的”(即所有像素都是新的),另一个圆是部分新的(某些像素,重叠的像素)不是新的,而其他像素是新的。使用 tikz 的填充不透明度无法处理这种情况(尽管您可以进行一些剪辑和一些很快就会变得非常复杂的事情)。

一种方法是http://www.texample.net/tikz/examples/venn-diagram/

注意最后一张图,所有颜色都褪色了。在我的模式下,它们不会被褪色,因为没有一个圆圈像素会与白色混合,而是全部与自身混合。

再次,可以通过剪辑和改变 alpha 值以非常复杂的方式实现我的效果,但根据我所描述的方法,可以更容易地实现 = 如果是新像素,则强制 alpha 通道 = 255。

答案1

据我所知,这是不可能的,因为输出格式不支持。TikZ/PGF 最常见的输出格式是向量格式。这意味着它们不是通过像素来指定图形元素,而是通过路径来指定,并说明如何处理这些路径。这具有明显的优势,因为它们通常较小(诚然,对于特别适合这种格式的绘图类型而言),并且它们可以完美缩放。这是渲染器或者查看者将这些命令解释为屏幕或纸张上的某些内容,并且只有在该阶段像素才会发挥作用。此时,TeX 已停止工作,并且无法将信息从渲染器反馈给原始 tex 进程。

有关矢量格式的更多信息,请参阅PDF 上的维基百科页面

然而,这并不是说你要求的是不可能的。当然可以模拟您想要的效果。我能想到的最直接的方法是:您希望每个点的“基础”颜色是首先绘制在那里的颜色。因此,我们首先创建图片的副本,其中每种颜色都是其初始颜色。然后我们在此副本上绘制真实的图片,并根据需要设置 alpha。这应该具有正确的效果,因为当每个元素被渲染时,如果它是“第一个”,它将与自身的不透明副本混合,从而成为自身的不透明版本,但如果它不是第一个,那么它将与已经存在的元素混合,这是理所当然的。

要创建每个颜色都是其初始颜色的副本,我们需要反向绘制图像,并将每个颜色设置为完全不透明。当然,这可能需要针对特定​​图片进行一些规划。

这是您链接到的维恩图的示例。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/48905/86}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\def\firstcircle{(0,0) circle (1.5cm)}
\def\secondcircle{(45:2cm) circle (1.5cm)}
\def\thirdcircle{(0:2cm) circle (1.5cm)}
\begin{document}
\begin{tikzpicture}
\begin{scope}[fill opacity=0.5,text opacity=1]
        \fill[red] \firstcircle;
        \fill[green] \secondcircle;
        \fill[blue] \thirdcircle;
        \draw \firstcircle node[below] {$A$};
        \draw \secondcircle node [above] {$B$};
        \draw \thirdcircle node [below] {$C$};
    \end{scope}
\begin{scope}[yshift=-5cm]
        \fill[blue] \thirdcircle;
        \fill[green] \secondcircle;
        \fill[red] \firstcircle;
\begin{scope}[fill opacity=0.5,text opacity=1,every node/.style={ellipse,fill=white}]
        \fill[red] \firstcircle;
        \fill[green] \secondcircle;
        \fill[blue] \thirdcircle;
        \draw \firstcircle node[below] {$A$};
        \draw \secondcircle node [above] {$B$};
        \draw \thirdcircle node [below] {$C$};
    \end{scope}
\end{scope}
\end{tikzpicture}
\end{document}

结果(原始结果在最上面):

第一个颜色逐渐褪色,不透明

答案2

我不太明白您正在寻找的具体细节,但我认为您会发现这些链接很有用:

相关内容