Wie färbt man ein Graustufensymbol auf einem nicht weißen Hintergrund?

Wie färbt man ein Graustufensymbol auf einem nicht weißen Hintergrund?

Ich habe ein schwarz auf transparentes Symbol in einer PNG-Datei. Ich möchte dieses Symbol an verschiedenen Stellen in einem LaTeX-Dokument in verschiedenen Farben verwenden. Als Bonus wäre es gut, wenn ich der oberen Hälfte des Symbols eine andere Farbe geben könnte als der unteren Hälfte, da es manchmal am Rand verschiedener Hintergründe erscheint.

Diese Antwortzeigt, wie man eine Graustufen-PNG-Datei einfärbt. Dabei ist es ganz einfach, der oberen Hälfte eine andere Farbe zu geben als der unteren. Leider muss das Logo dafür auf einem weißen Hintergrund sein:

\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
    \fill[yellow!50!white] (0,1) rectangle (2,2);
    \fill[gray!50!black]   (0,0) rectangle (2,1);

    \begin{scope}[blend group=screen]
        \node[inner sep=0,line width=0] (logo) at (1,1) [anchor=center] {\includegraphics{icon-bw}};
        \fill[blue] (logo.west) rectangle (logo.north east);
        \fill[green] (logo.south west) rectangle (logo.east);
    \end{scope}
\end{tikzpicture}
\end{document}

Ein Beispielsymbol mit hinzugefügtem weißem Hintergrund: icon-bw.png

Wenn ich stattdessen ein PNG von Schwarz zu Transparent verwende, wird der gesamte Knoten blau und grün eingefärbt.

Ein Beispielsymbol mit transparentem Hintergrund: Symbol.png

Diese Antwortzeigt, wie man eine PNG-Datei als Transparenzmaske verwendet. Aber wie verschiebe ich das Symbol so, dass es auf (1,1) zentriert ist?

\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{fadings}

\begin{tikzfadingfrompicture}[name=icon]
    \begin{scope}[transparency group]
    \node (icon) [fill, draw, white] {\includegraphics[height=1cm]{icon}};
    \begin{scope}[blend mode=difference]
    \fill[white] (icon.south west) rectangle (icon.north east);
    \end{scope}
    \end{scope}
\end{tikzfadingfrompicture}

\begin{document}
\begin{tikzpicture}
    \fill[yellow!50!white] (0,1) rectangle (2,2);
    \fill[gray!50!black]   (0,0) rectangle (2,1);

    % How I intend to use it
    \begin{scope}[scope fading=icon, fit fading=false]
        \fill[blue] (0.5,1) rectangle (1.5,1.5);
        \fill[green] (0.5,0.5) rectangle (1.5,1);
    \end{scope}

    % Approach of the original answer. The icon is not positioned correctly.
    % The specified coordinate does not seem to make any difference.
    \path[scope fading=icon,fit fading=false] (1,1);
    \node[fill=yellow,minimum width=1cm,minimum height=1cm] {};
\end{tikzpicture}
\end{document}

In meinem tatsächlichen Anwendungsfall besteht das Symbol nur aus Schwarz und Transparenz. Es wäre also akzeptabel, wenn eine Antwort mit Zwischengrautönen nicht funktioniert.

Antwort1

Das verblassende Muster wird um (0,0) zentriert und kann nur verschoben werden, indem der Knoteninhalt mithilfe von Elementen wie \hspaceund verschoben wird \raisebox. Beim Verschieben der Implementierung wird nur das Muster an dieser Stelle (außerhalb des Rands) verwendet. Da es zentriert ist, müssen Sie es doppelt so weit verschieben, wie es sich tatsächlich bewegt.

\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{fadings}

\begin{tikzfadingfrompicture}[name=icon,inner sep=0]
  \node [fill=transparent!0]
    {\hspace{2cm}\raisebox{2cm}{\includegraphics[height=2cm, width=2cm]{images/icon}}};
\end{tikzfadingfrompicture}

\begin{document}
\begin{tikzpicture}
  \fill[yellow!50!white] (0,1) rectangle (2,2);
  \fill[gray!50!black]   (0,0) rectangle (2,1);
  \begin{scope}[shift={(1,1)}]
    \path[scope fading=icon, fit fading=false];
    \node[bottom color=blue,top color=green,minimum width=2cm,minimum height=2cm]{};
  \end{scope}
\end{tikzpicture}
\end{document}

Demo

Antwort2

Diese Antwort unterscheidet sich von der von John Kormylo hauptsächlich in zwei Punkten:

  • Ich verwende fading transformdort, wo ich das Fading anwende, anstelle von \hspaceund \raiseboxin der Fading-Definition. Beachten Sie auch, dass ich path fadinganstelle von verwende scope fading. Ich bin nicht sicher, wie groß der Unterschied ist, aber ich habe es nicht zum Laufen gebracht , als ich scope fadingund fading transforman eine scopeUmgebung übergeben habe.
  • Ich invertiere die Farben der PNG-Datei, sodass die schwarzen statt der transparenten Teile ausgefüllt werden.
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{fadings}

\newcommand\IconNodeContent{%
    \includegraphics[height=1cm]{icon}%
}

\begin{tikzfadingfrompicture}[name=icon]
    % I am using \fill[white] with blend mode=difference to invert the colors
    % so that I can use my black on transparent icon without needing to convert it to white on transparent/black.
    % This has the down side that the area around the icon node is not transparent but opaque.
    % I am increasing the transparent area a little with draw thick to avoid a visible rectangle around the icon when filling it later.
    \begin{scope}[transparency group]
    \node (icon) [fill, draw, thick, white] {\IconNodeContent};
    \begin{scope}[blend mode=difference]
    \fill[white] (icon.south west) rectangle (icon.north east);
    \end{scope}
    \end{scope}
\end{tikzfadingfrompicture}

\begin{document}
\begin{tikzpicture}
    % draw background
    \fill[yellow!50!white] (0,1) rectangle (2,2);
    \fill[gray!50!black]   (0,0) rectangle (2,1);

    % create an invisible node to define size and position of icon
    \node (icon) at (1,1) [anchor=center, transparent] {\IconNodeContent};
    % draw the top half of the icon in one color, shifting the coordinates 1pt inwards to make sure no border is visible
    \fill[blue,  path fading=icon, fit fading=false, fading transform={shift=(icon.center)}] ([shift={(1pt,-1pt)}] icon.north west) rectangle ([shift={(-1pt,+0pt)}] icon.east);
    % draw the bottom half of the icon in another color, shifting the coordinates 1pt inwards to make sure no border is visible
    \fill[green, path fading=icon, fit fading=false, fading transform={shift=(icon.center)}] ([shift={(1pt,+1pt)}] icon.south west) rectangle ([shift={(-1pt,-0pt)}] icon.east);
\end{tikzpicture}
\end{document}

Ausgabe

verwandte Informationen