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