Coloque um nó em um determinado valor de pixel dentro de uma imagem

Coloque um nó em um determinado valor de pixel dentro de uma imagem

Eu tenho uma imagem em PDF com 4903 × 314 pixels. Como posso colocar um nó na imagem em (3903, 251)? A própria imagem será dimensionada para caber na largura da página.

Responder1

EDIT: Adicionada segunda macro para vários nós

Descrição de \PlaceInImageAt: Os primeiros argumentos (#1,#2)devem ser o tamanho do pixel da imagem, o segundo (#4,#5)deve ser o pixel no qual você deseja colocar o seu nó. #3deve ser a imagem a ser usada, os opcionais [#6]são as opções que você pode fornecer \nodee, finalmente, #7o conteúdo desse nó. O argumento size (#1,#2)é opcional. Se não for especificado, (100,100)será usado. Você pode dimensionar a imagem para qualquer tamanho que desejar (mesmo desproporcional) alterando o \includegraphicscomando em #3.

Descrição de \MultiPlaceInImageAt: Os três primeiros argumentos são idênticos. O opcional [#4]leva opções que devem ser passadas para cada nó. O último argumento é uma lista separada por vírgulas. Cada nó deve ser colocado entre colchetes com o seguinte 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}

insira a descrição da imagem aqui

Responder2

Aqui está um código que faz isso se você apenas dimensionar os gráficos \textwidth(de forma que a escala vertical seja proporcional).

ATUALIZAR: Escreveu uma pequena 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}

informação relacionada