TikZ で \includeimage を使用して埋め込まれた画像をピクセル精度で描画するにはどうすればよいですか?

TikZ で \includeimage を使用して埋め込まれた画像をピクセル精度で描画するにはどうすればよいですか?

\includeimage を使用して埋め込んだ画像に描画したい:

\documentclass[tikz]{standalone}
\begin{document}
  \begin{tikzpicture}
    \node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics{example-image}};
    \begin{scope}[x={(image.south east)},y={(image.north west)}]
      \draw[color=red] (0,0) rectangle (1,1);
    \end{scope}
  \end{tikzpicture}
\end{document}

画像のサイズが800x600ピクセルだとします。ここでの問題は、xとyの幅と高さが0から1の間でスケールすることです。画像のピクセルを座標参照として使用して、次のように画像に描画したいと思います。

\draw[color=red] (0,0) rectangle (1,1);

次のように置き換えることができる

\draw[color=red] (0,0) rectangle (800,600);

私の現在の問題は、スコープ内の x と y をスケーリングすることです。次のステートメントが機能すると思いました。

\begin{scope}[x={($(image.south east)/800$)},y={($(image.north west)/600$)}]

しかし、次のエラーが発生します。

Package tikz Error: + or - expected.

TikZ/PGF マニュアルの第 13.5 章を調べましたが、この方法では image.direction ステートメントでは機能しないようです。

スコープを適切に拡張するにはどうすればよいでしょうか?

答え1

編集:私の回答の最初のバージョンでは、@Jake がコメントで指摘したように、質問の要点が抜けていました...そこで、@Jake の回答に触発されて修正した解決策を以下に示します。

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

\begin{document}
    \begin{figure}
\centering
\sbox0{\includegraphics[width=0.5\textwidth]{example-image}}%
\begin{tikzpicture}[x=\wd0/800, y=\ht0/600]
\node[anchor=south west,inner sep=0pt] at (0,0){\usebox0};
\draw[blue] (200,100) rectangle + (500,300);
\draw[red,thick] (0,0) rectangle + (800,600);
\end{tikzpicture}
    \end{figure}
\end{document}

主な違いは、代わりに新しい長さが使用されbox0、それが提供する可能性です。これにより、上記のコードは多少短くなりますが、結果は同じになります。

ここに画像の説明を入力してください

補遺:@jfbu のコメントにあるように、「... は、特にまたは の\box0使用を遅らせると、少し危険な場合があります。 を実行して を使用する方が安全です... 」。したがって、今のところ で悪い経験はありませんが、LateX の使用を安全に行うために、上記の MWE を次のように書き直すことをお勧めします。\wd0\ht0\newsavebox\mybox\sbox\mybox\wd\myboxbox0

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

\newsavebox\mybo

% for show only a figure
\usepackage[active,floats,tightpage]{preview}
\PreviewBorder{1em}

\begin{document}   
    \begin{figure}[h]
\centering
\sbox\mybox{\includegraphics[width=0.5\textwidth]{example-image}}%
\begin{tikzpicture}[x=\wd\mybox/800, y=\ht\mybox/600]
    \node[anchor=south west,inner sep=0pt] at (0,0) {\usebox\mybox};
    \draw[blue,very thin] (200,100) rectangle + (500,300);
    \draw[red,thick] (0,0) rectangle + (800,600);
\end{tikzpicture}
    \end{figure}
\end{document}

ボット ソリューションには重要な利点があります。画像は保存ボックスに保存するときにのみ処理され、その後は\usebox\mybox最初の例に従って として使用されます\usebox0。これにより、コンパイル時間が短縮される可能性があります (@jfbu のコメントでも述べられているように)。

答え2

正しいことを試みていますが、座標計算の構文には少し制限があります。ベクトルを伸ばす係数が式の先頭に現れることを期待しています。したがって、次のように使用できます。

\begin{scope}[x={($1/800*(image.south east)$)},y={($1/600*(image.north west)$)}]

しかし、どうやらこのアプローチには精度の問題があり、結果として得られる座標系が画像と正確に一致しないことが判明しました。

代わりに、cfrのアプローチを使用することをお勧めします。https://tex.stackexchange.com/a/269850/2552これは私の場合は問題なく動作します(ただし、入力する量が増えます)。

\documentclass[tikz, demo]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}

\newlength\iwidth
\newlength\iheight
\settoheight\iheight{\includegraphics{example-image}}
\settowidth\iwidth{\includegraphics{example-image}}

  \begin{tikzpicture}[x=\iwidth/800, y=\iheight/600]
    \node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics{example-image}};
      \draw[color=red] (0, 0) rectangle (800, 600);
  \end{tikzpicture}
\end{document}

関連情報