Recently I created an SVG file with some simple black-and-white icons I
wanted to use in an application. The file contains a red background to
differentiate between the single icon tiles, whose opacity
is set
to 0.3
. The single icons all have an attribute
fill="black"
.
The task was then to create CSS sprites from this file. The icons should be variated in four different colors and each one glued together in a single PNG file.
Taking advantage of the plain-text-ness of SVG this was a simple task for
sed
, with a little shell script around to create a PNG file:
#!/bin/bash
sed -e 's/opacity="\.3"/opacity="0"/' -e "s/black/$1/" icons.svg \
| inkscape --export-png=first_icon.${1#\#}.png \
-a 0:0:24:24 /proc/self/fd/0
A sample invocation to create a red icon would look like
$ colorize_icon '#ff0000'
The trick with /proc/self/fd/0
forces Inkscape to accept
stdin
as input SVG file. Credit for this goes to keegan in the
Ksplice company blog.
Line 3 reads in the SVG source. The two sed
commands
manipulate the source by
- setting the opacity to
0
for the helper background, letting it vanish, and - changing all occurences of the string
to whatever is the first positional parameter.black
The second line starts with a pipe, that puts the manipulated source in the
stdin
stream for the inkscape
command. Inkscape is
used, without a GUI, to render the portion between 0,0
and
24,24
(Inkscape’s coordinate system defines 0,0
as
lower left corner!) as the file first_icon.<COLORNAME>.png
.
The curly braces and hashes are used to remove the #
character
from the color given as positional parameter by utilizing Bash’s built-in
string manipulation.