calls for heavy Photoshop actions.
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
0for 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.