TikZ 叠加层的像素坐标

TikZ 叠加层的像素坐标

我想创建一个tikzpicture从光栅图像(比如说 PNG)导入矩形部分,并在其上方放置其他 TikZ 节点。棘手的部分是我需要根据光栅图像中的像素来定位 TikZ 节点。

基于这个例子,我们可以让空间(0,0) -- (1,1)跨越图像。我认为这只是缩放的问题:

\documentclass[tikz]{standalone}

\usepackage{tikz}
\usepackage{mwe}

\begin{document}
\begin{tikzpicture}

\node[anchor=south west,inner sep=0] (image) at (0,0)
  {\includegraphics[width=0.9\textwidth]{example-image.jpg}};

\begin{scope}[x={(image.south east)},y={(image.north west)}]
  \begin{scope}[xscale=1/400, yscale=1/300]
    \draw[red,ultra thick,rounded corners] (200, 200) rectangle (300, 250);
  \end{scope}
\end{scope}

\end{tikzpicture}
\end{document}

有两个问题:

  1. 我想避免对图像尺寸进行硬编码
  2. 更紧迫的是,此操作会失败并显示以下错误消息:
! Dimension too large.
<recently read> \pgf@xx 
                        
l.14 ...ed,ultra thick,rounded corners] (200, 200)
                                                   rectangle (300, 250);

答案1

这是个好问题。为了回答你的两个问题(难以在图像上定位点,以及Dimension too large错误),我建议使用不同的方法(除了这个答案- 扩展很重要!)如下。

如何轻松地确定图像上的点?通过 TikZ 的节点插入图像,使用您认为合适的选项,然后绘制网格以便于定位。

这是我为了好玩而画的一幅图(尚未完成),它说明了上面提到的技巧。点A=(Ax,Ay)和位于VAIO 徽标的B=(Bx,By)底部V和顶部。A

在此处输入图片描述

\documentclass[tikz,border=5mm]{standalone}
\usepackage{comment}
\begin{document}
\begin{tikzpicture}
%\begin{comment}
% for easy positioning points from the image
\draw[violet!20,very thin] (-3,-1) grid[step=.2] (3,1);
\draw[violet,thin] (-3,-1) grid (3,1);
\foreach \i in {-3,...,3} \path (\i,-1) node[below]{\i};
\foreach \j in {-1,0,1} \path (-3,\j) node[left]{\j};
% https://lambanner.com/y-nghia-an-logo/
\path (0,0) node[opacity=.5]{\includegraphics[width=5cm]{vaiologo.png}};
\fill[red] (0,0) circle(1pt);
% also see https://1000logos.net/vaio-logo/
%\end{comment}

% positioning by trial-and-error
% A=(\Ax,\Ay) the bottom of V
% B=(\Bx,\By) the top of A
\def\Ax{-1.45}
\def\Ay{-.48}
\def\Bx{-.48}
\def\By{.46}

% the middle of VA
\def\VAcurve{(\Ax,\Ay) .. controls +(0:.4) and +(180:.4) ..(\Bx,\By)}
% the right of VA
\def\VAcurveRight{{[shift={(\Bx,0)},xscale=-1,shift={(-\Bx,0)}]\VAcurve}}
% the left of VA
\def\VAcurveLeft{{[shift={(\Ax,0)},xscale=-1,shift={(-\Ax,0)}]\Vcurve}}
\draw[line width=2mm,red,opacity=1] \VAcurve \VAcurveRight \VAcurveLeft 
;
\end{tikzpicture}
\end{document}

comment

在此处输入图片描述

答案2

对于第二个问题,我找到了一种解决方案,即将坐标系设置为1/4001/300增量,并翻转 Y 轴:

\node[anchor=south west,inner sep=0] (image) at (0,0)
  {\includegraphics[width=0.9\textwidth]{example-image.jpg}};

\begin{scope}[x={(image.south east)},y={(image.north west)}]
  \begin{scope}[shift={(0,1)},x={(1/400,0)},y={(0,-1/300)}]
    \draw[red,ultra thick,rounded corners] (200, 200) rectangle (300, 250);
    \draw[red,ultra thick,rounded corners] (0, 0) rectangle (100, 100);
  \end{scope}
\end{scope}

第一个问题(计算增量1/400-1/300图片的光栅尺寸)仍然是一个悬而未决的问题。

相关内容