![TikZ:参考外部图片定义图案](https://linux22.com/image/265114/TikZ%EF%BC%9A%E5%8F%82%E8%80%83%E5%A4%96%E9%83%A8%E5%9B%BE%E7%89%87%E5%AE%9A%E4%B9%89%E5%9B%BE%E6%A1%88.png)
我想根据外部图片用图案填充 tikz 图片。可以吗?如果可以,怎么做?
我尝试用定义一个新模式\pgfdeclarepatternformonly
,但\pgfuseimage
里面似乎没有有效的命令\pgfdeclarepatternformonly
。
评论:
- 在我的例子中我使用了一个大理石-图片,但我的问题与这张特殊的图片无关。
- 我强制将图块设置为 1cm。使用图块图像的实际尺寸可能更好。
- 如果我定义
\pgfdeclarepatternformonly
后,\begin{document}
LaTeX 错误就会消失,但模式不起作用。
我的 MNWE(最小不起作用的示例):
\documentclass[]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}
%Source: http://upload.wikimedia.org/wikipedia/de/thumb/f/f9/LapG.jpg/83px-LapG.jpg
%But could be any other picture
\pgfdeclareimage[width=1cm,height=1cm]{marble}{83px-LapG}%force quadratic tile
\pgfdeclarepatternformonly{marble}{\pgfpoint{0cm}{0cm}}{\pgfpoint{1cm}{1cm}}{\pgfpoint{1cm}{1cm}}{
\pgfuseimage{marble}%! LaTeX Error: Missing \begin{document}.
}
\begin{document}
\begin{tikzpicture}
% This should create a rectangle with 15*15 tiles.
\draw[pattern=marble] (0,0) rectangle (15,15);
\end{tikzpicture}
\end{document}
答案1
使用 是不可能的pattern
,但使用path picture
密钥和一些计算就可以。
我已经使用了纹理-s.blogspot.de。
我把代码变成了一个小型的 TikZ 库,这是我的tikz-ext
包裹。
它的用法可以在下面或者手册中看到。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric, ext.patterns.images}
\pgfsetupimageaspattern[width=1cm]{marble}{marble.jpg}
\pgfsetupimageaspattern[width=2cm]{wall}{concretewall8.jpg}
\pgfsetupimageaspattern[width=2cm]{floor}{pattern4183.jpg}
\begin{document}
\tikz\matrix[column sep=2mm]{
\path[image as pattern={name=marble}] (0,0) circle[radius=1cm];
& \node[image as pattern={name=wall},star, star point ratio=2, minimum size=2cm] {};
& \path[even odd rule, image as pattern={name=floor}]
(0,0) circle[radius=1cm] circle[radius=5mm];
& \draw[green, even odd rule, image as pattern={name=floor}]
(0,0) circle[radius=1cm] circle[radius=5mm];
\draw[blue, image as pattern={name=floor}]
(-1cm, -1cm) (0,0) to[bend left] (2,1)
--++(right:.1) to[bend left] (.1,0) -- cycle;
\\};
\end{document}
输出
答案2
使用 PSTricks 是可以实现的。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{graphicx}
\usepackage{pst-fill}
\psboxfill{\includegraphics[scale=0.1]{example-image-A}}
\begin{document}
\begin{pspicture}(4,4)
\pscircle[fillstyle=boxfill](2,2){2}
\pscircle(2,2){2}
\end{pspicture}
\end{document}
答案3
对于非重复图案,path picture={\node{whatever thing to draw};}
提供了极大的灵活性,例如,允许您在绝对位置的背景中绘制图像。否则,您可以按照建议使用 tcolorbox 包中的 TikZ 图像填充扩展这里:
\documentclass{article}
\usepackage[skins]{tcolorbox}
\begin{document}
\noindent\begin{tikzpicture}
\path[fill overzoom image=example-image-a] (0,0) rectangle (\textwidth,4cm);
\end{tikzpicture}
\medskip
\noindent\begin{tikzpicture}
\path[fill stretch image=example-image-b] (0,0) rectangle (\textwidth,4cm);
\end{tikzpicture}
\medskip
\noindent\begin{tikzpicture}
\path[fill tile image*={height=3cm}{example-image-c}] (0,0) rectangle (\textwidth,4cm);
\end{tikzpicture}
Absolute positioning:
% absolute coordinates
\noindent\begin{tikzpicture}
[
remember picture,
absolute fill image/.style={
path picture={
\node[anchor=center] at (current page.center) {\includegraphics[width=\paperwidth,height=\paperheight]{#1}};
}
}
]
\path[draw=green,absolute fill image={example-image-b}] (0,0) circle[radius=1cm];
\path[draw=red,absolute fill image={example-image-b}] (.5,.5) circle[radius=1cm];
\end{tikzpicture}
\end{document}