¿Cómo dibujo imágenes incrustadas con \includeimage en TikZ con precisión de píxeles?

¿Cómo dibujo imágenes incrustadas con \includeimage en TikZ con precisión de píxeles?

Quiero dibujar en una imagen que incrusté usando \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}

Digamos que la imagen tiene un tamaño de 800x600 píxeles. El problema aquí es que xey escalan entre 0 y 1 en ancho y alto. Me gustaría dibujar en la imagen usando sus píxeles como referencia de coordenadas, de manera que

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

puede ser reemplazado por

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

Mi problema ahora es escalar xey en el alcance. Pensé que la siguiente declaración funcionaría:

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

pero arroja el siguiente error:

Package tikz Error: + or - expected.

Busqué el capítulo 13.5 en el manual de TikZ/PGF, pero parece que no funciona con la declaración image.direction de esta manera.

¿Cómo puedo escalar mi alcance de la manera correcta?

Respuesta1

Editar:En la primera versión de mi respuesta, como señaló @Jake en su comentario, no entendí el punto de la pregunta... así que aquí está la solución corregida, inspirada en la respuesta de @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}

La principal diferencia es que en su lugar se utilizan nuevas longitudes box0y posibilidades que ofrece. Con este código anterior es algo más corto pero da el mismo resultado:

ingrese la descripción de la imagen aquí

Apéndice:Cabe señalar, como dice @jfbu en su comentario: "... \box0a veces es un poco peligroso, especialmente si retrasas el uso de \wd0o \ht0. Es más seguro hacerlo \newsavebox\myboxy usar \sbox\mybox, \wd\mybox...". Entonces, aunque hasta ahora no he tenido malas experiencias con box0, es mejor mantenerse en el lado seguro del uso de LateX y reescribir MWE arriba en:

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

La solución de bots tiene una ventaja importante: la imagen se procesa solo (cuando se almacena en el cuadro de guardado y luego se usa como \usebox\myboxo de acuerdo con el primer ejemplo como \usebox0. Esto reduce potencialmente el tiempo de compilación (como también indicó @jfbu en su comentario).

Respuesta2

Estás intentando lo correcto, pero la sintaxis de cálculo de coordenadas es un poco limitada: espera que el factor para estirar el vector aparezca al comienzo de la expresión. Entonces podrías usar

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

Sin embargo, resulta que aparentemente este enfoque tiene algunos problemas de precisión, ya que el sistema de coordenadas resultante no coincide exactamente con la imagen.

En su lugar, es posible que desee utilizar el enfoque de CFR dehttps://tex.stackexchange.com/a/269850/2552, que me funciona sin problemas (pero implica escribir más):

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

información relacionada