It is not possible with pattern
, but with the path picture
key and a few calculations.
I have used patterns available at texture-s.blogspot.de.
I have turned the code into a small TikZ library and added a macro and two keys:
\pgfSetupImageAsPattern[<opt arguments for \pgfdeclareimage>]{<name>}{<path/file>}
is a wrapper for \pgfdeclareimage
but also automatically measures the resulting image (if only one of the dimensions (width
and height
) is given, PGF keeps the aspect ratio of the image, but it is not accessible for the user).
use image as pattern=<name>
sets up the pattern <name>
for use with the key image as pattern
. This key is intended to set the image scope-wide. It can also be used at every path, though it may be preferable to setup an own style:
\tikzset{marble/.style={use image as pattern=marble, image as pattern}}
and then simply use \path[marble] …;
.
image as pattern=<opt arguments for \pgftext>
actually uses the previously set <name>
pattern. The key accepts one optional argument that is forwarded to the internally used \pgftext
.
The placing of these images starts with one image centered on the south west point of the path. This can be changes by the optional argument to image as pattern
as shown in the two latter examples of the document below.
As this is hardly noticeable with white-noise-ish marble patterns I have used the following image to show this:

Keys useable for \pgftext
are
center
(default), left
, right
, top
, bottom
, base
(=bottom
as PGF images do not have a depth),
x
, y
(similar to xshift
and yshift
), and
rotate
(needs manual adjusting with patterns.image
).
Code
% This is the TikZ library patterns.images
% Load with \usetikzlibrary{patterns.images}
%
% Macro:
% - \pgfSetupImageAsPattern[<opt arguments for \pgfdeclareimage>]{<name>}{<path/file>}
%
% Keys are:
% - use image as pattern=<name>
% - image as pattern=<opt arguments for \pgftext>
\newlength\qrr@pgf@iap@width
\newlength\qrr@pgf@iap@height
\def\pgfSetupImageAsPattern{\pgfutil@ifnextchar[\qrr@pgfSetupImageAsPattern{\qrr@pgfSetupImageAsPattern[]}}
\def\qrr@pgfSetupImageAsPattern[#1]#2#3{% #1 = options
% #2 = image name
% #3 = file name
\pgfdeclareimage[#1]{qrr@pgf@iap@#2}{#3}%
\sbox\pgfutil@tempboxa{\pgfuseimage{qrr@pgf@iap@#2}}%
\expandafter\edef\csname qrr@pgf@iap@#2@width\endcsname{\the\wd\pgfutil@tempboxa}%
\expandafter\edef\csname qrr@pgf@iap@#2@height\endcsname{\the\ht\pgfutil@tempboxa}%
}
\tikzset{
image as pattern/.code={
\edef\qrr@pgf@iap@options{#1}%
\pgfkeysalso{/tikz/path picture={%
\pgf@process{\pgfpointanchor{path picture bounding box}{north east}}%
\pgf@xa\pgf@x\pgf@ya\pgf@y
\pgf@process{\pgfpointanchor{path picture bounding box}{south west}}%
\pgf@xb\pgf@x\pgf@yb\pgf@y\pgf@yc\pgf@yb
\pgfutil@loop
{%
\pgfutil@loop
\expandafter\pgftext\expandafter[\qrr@pgf@iap@options,at=\pgfqpoint{\pgf@xb}{\pgf@yb}]{\pgfuseimage{qrr@pgf@iap@\qrr@pgf@iap@name}}%
\ifdim\pgf@yb<\pgf@ya
\advance\pgf@yb\qrr@pgf@iap@height
\pgfutil@repeat
}%
\ifdim\pgf@xb<\pgf@xa
\advance\pgf@xb\qrr@pgf@iap@width
\pgf@yb\pgf@yc
\pgfutil@repeat
}}%
},
use image as pattern/.code={%
\edef\qrr@pgf@iap@name{#1}%
\expandafter\qrr@pgf@iap@width\csname qrr@pgf@iap@#1@width\endcsname
\expandafter\qrr@pgf@iap@height\csname qrr@pgf@iap@#1@height\endcsname
}
}
\endinput
Test file
\documentclass[tikz,convert]{standalone}
\usetikzlibrary{shapes.geometric, patterns.images}
\pgfSetupImageAsPattern[width=1cm]{marble}{pattern1_.jpg}
\pgfSetupImageAsPattern[width=2cm]{leopard}{texture_4_.png}
\pgfSetupImageAsPattern[width=2cm]{cross}{cross}
\begin{document}
\begin{tikzpicture}[use image as pattern=marble]
\path[image as pattern] (0,0) circle (1cm);
\end{tikzpicture}
\begin{tikzpicture}[use image as pattern=leopard]
\node[image as pattern,star, star point ratio=2,minimum size=2cm] {};
\end{tikzpicture}
\begin{tikzpicture}[use image as pattern=cross]
\draw[image as pattern] (0,0) rectangle (5,5);
\end{tikzpicture}
\begin{tikzpicture}[use image as pattern=cross]
\draw[image as pattern={left,bottom}] (0,0) rectangle (5,5);
\end{tikzpicture}
\end{document}
Output 1

Output 2

\pgfuseimage
inside a\pgftext
. Though, this will still not show the image.