我想创建一个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}
有两个问题:
- 我想避免对图像尺寸进行硬编码
- 更紧迫的是,此操作会失败并显示以下错误消息:
! 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/400
和1/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
图片的光栅尺寸)仍然是一个悬而未决的问题。