Coloque un nodo en un valor de píxel determinado dentro de una imagen

Coloque un nodo en un valor de píxel determinado dentro de una imagen

Tengo una imagen en pdf de 4903 × 314 píxeles. ¿Cómo puedo colocar un nodo en la imagen en (3903, 251)? La imagen en sí se escalará para ajustarse al ancho de la página.

Respuesta1

EDITAR: Se agregó una segunda macro para múltiples nodos

Descripción de \PlaceInImageAt: Los primeros argumentos (#1,#2)deben ser el tamaño de píxel de la imagen, el segundo (#4,#5)debe ser el píxel en el que desea colocar su nodo. #3debe ser la imagen a usar, los opcionales [#6]son las opciones que le puedes dar \nodey por último #7están los contenidos de ese nodo. El argumento de tamaño (#1,#2)es opcional. Si no se especifica, (100,100)se utiliza. Puede escalar la imagen al tamaño que desee (incluso no proporcional) modificando el \includegraphicscomando en #3.

Descripción de \MultiPlaceInImageAt: Los primeros tres argumentos son idénticos. El opcional [#4]toma opciones que deben pasarse a cada nodo. El último argumento es una lista separada por comas. Cada nodo debe estar encerrado entre llaves con el siguiente esquema {<x>,<y>=[<options>]<content>}.

\documentclass[]{article}

\usepackage{tikz,graphicx}
\makeatletter
\newbox\PlaceInImageAtbox
\newcommand\PlaceInImageAt{}% just to check whether it is already defined
\def\PlaceInImageAt
  {%
    \@ifnextchar(
      {\PlaceInImageAt@i}
      {\PlaceInImageAt@i(100,100)}
  }
\def\PlaceInImageAt@i(#1,#2)#3(#4,#5)%
  {%
    \@ifnextchar[
      {\PlaceInImageAt@ii{#1}{#2}{#3}{#4}{#5}}
      {\PlaceInImageAt@ii{#1}{#2}{#3}{#4}{#5}[]}%
  }
\def\PlaceInImageAt@ii#1#2#3#4#5[#6]#7%
  {%
    \setbox\PlaceInImageAtbox\hbox{#3}%
    \begin{tikzpicture}
      \draw[use as bounding box] node at (0,0) {\usebox\PlaceInImageAtbox};
      \pgfmathsetmacro\PlaceInImageAtx{(#4 - #1/2) * (\wd\PlaceInImageAtbox/#1)}
      \pgfmathsetmacro\PlaceInImageAty{(#5 - #2/2) * (\ht\PlaceInImageAtbox/#2)}
      \node[#6] at (\PlaceInImageAtx pt,\PlaceInImageAty pt) {#7};
    \end{tikzpicture}%
  }
\def\MultiPlaceInImageAt
  {%
    \@ifnextchar(
      {\MultiPlaceInImageAt@i}
      {\MultiPlaceInImageAt@i(100,100)}
  }
\def\MultiPlaceInImageAt@i(#1,#2)#3%
  {%
    \@ifnextchar[
      {\MultiPlaceInImageAt@ii{#1}{#2}{#3}}
      {\MultiPlaceInImageAt@ii{#1}{#2}{#3}[]}%
  }
\def\MultiPlaceInImageAt@ii#1#2#3[#4]#5%
  {%
    \setbox\PlaceInImageAtbox\hbox{#3}%
    \begin{tikzpicture}
      \draw[use as bounding box] node at (0,0) {\usebox\PlaceInImageAtbox};
      \@for\arg@MultiPlace:={#5}\do
        {%
          \expandafter
          \MultiPlaceInImageAt@each\arg@MultiPlace\@rgend{#1}{#2}{#4}
        }
    \end{tikzpicture}
  }
\def\MultiPlaceInImageAt@each#1,#2=%
  {%
    \@ifnextchar[
      {\MultiPlaceInImageAt@each@i{#1}{#2}}
      {\MultiPlaceInImageAt@each@i{#1}{#2}[]}%
  }
\def\MultiPlaceInImageAt@each@i#1#2[#3]#4\@rgend#5#6#7%
  {%
    \pgfmathsetmacro\PlaceInImageAtx{(#1 - #5/2) * (\wd\PlaceInImageAtbox/#5)}
    \pgfmathsetmacro\PlaceInImageAty{(#2 - #6/2) * (\ht\PlaceInImageAtbox/#6)}
    \node[#7,#3] at (\PlaceInImageAtx pt, \PlaceInImageAty pt) {#4};
  }
\makeatother

\begin{document}
\PlaceInImageAt(4903,314){\includegraphics{example-image}}
  (3903,251)[draw,circle,red]{foo}

\PlaceInImageAt{\includegraphics[width=5cm,height=2cm]{example-image}}
  (50,50)[draw,circle,red]{foo}

\MultiPlaceInImageAt{\includegraphics[scale=0.5]{example-image-a}}
  [red]% option for each node
  {{20,20=[blue]a},{40,40={b}},{60,60={c}},{80,80={d}}}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Aquí hay un código que lo hace si solo escala los gráficos \textwidth(de modo que la escala vertical sea proporcional).

ACTUALIZAR: Escribí una pequeña macro para uso repetido.

\documentclass{article}
\usepackage{tikz}
\newcommand{\PlaceNode}[5][]{
\pgfmathsetmacro{\myx}{(#2-4903/2)*(\the\textwidth/4903)}
\pgfmathsetmacro{\myy}{(#3-314/2)*(\the\textwidth/4903)}
\node[#1] (#4) at  (\myx pt,\myy pt) {#5};
}
\begin{document}
\begin{tikzpicture}
\node at (0,0){\includegraphics[width=\textwidth]{example-image-a}};

\PlaceNode[draw,circle,red]{3903}{251}{first}{}
\PlaceNode[draw,circle,blue]{3703}{151}{second}{}

\end{tikzpicture}
\end{document}

información relacionada