Как рисовать на изображениях, встроенных с помощью \includeimage в TikZ, с точностью до пикселя?

Как рисовать на изображениях, встроенных с помощью \includeimage в TikZ, с точностью до пикселя?

Я хочу рисовать на изображении, которое я вставил с помощью \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.

Я посмотрел главу 13.5 в руководстве TikZ/PGF, но, похоже, она не работает с оператором 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иногда немного опасно, особенно если отложить использование \wd0или \ht0. Безопаснее сделать \newsavebox\myboxи использовать \sbox\mybox, \wd\mybox... ". Поэтому, хотя до сих пор у меня не было плохого опыта с box0, лучше оставаться на безопасной стороне использования LateX и переписать вышеприведенный MWE в:

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

Связанный контент