白以外の背景にあるグレースケールのアイコンに色を付けるにはどうすればよいでしょうか?

白以外の背景にあるグレースケールのアイコンに色を付けるにはどうすればよいでしょうか?

png ファイルに透明の背景に黒のアイコンがあります。このアイコンを LaTeX ドキュメント内のさまざまな場所でさまざまな色で使用したいと考えています。ボーナスとして、アイコンの上半分と下半分を異なる色にできれば便利です。これは、アイコンがさまざまな背景の境界に表示されることがあるためです。

この答えグレースケールの png ファイルをカラー化する方法を示しており、上半分と下半分に異なる色を与えるのは簡単です。残念ながら、ロゴは白い背景上になければなりません。

\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}

白い背景を追加したアイコンの例: アイコン-bw.png

代わりに黒から透明の png を使用すると、ノード全体が青と緑で塗りつぶされます。

背景が透明なアイコンの例: アイコン.png

この答えpng ファイルを透明マスクとして使用する方法を示します。しかし、アイコンを (1,1) の中心に配置するにはどうすればよいでしょうか?

\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}

実際の使用例では、アイコンは黒と透明のみで構成されています。そのため、中間のグレートーンでは回答が機能しないとしても許容されます。

答え1

フェード パターンは (0,0) を中心に配置されます。パターンを移動する唯一の方法は、 や などを使用してノードの内容を移動することです\hspace\raisebox実装を移動すると、その場所 (端から離れた場所) のパターンのみが使用されます。パターンは中央に配置されているため、実際に移動する距離の 2 倍の距離を移動する必要があります。

\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}

デモ

答え2

この回答は、主に次の 2 つの点で John Kormylo の回答と異なります。

  • フェーディング定義で と の代わりに を使用しています。また、 の代わりに を使用していることにも注意してください。fading transformその違いがどれほど大きいかはわかりませんが、と を環境に渡しても動作しませんでした。\hspace\raiseboxpath fadingscope fadingscope fadingfading transformscope
  • 透明な部分ではなく黒い部分が塗りつぶされるように、png ファイルの色を反転しています。
\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}

出力

関連情報