I have a site where I want to use the effect of a grayed out image that is colored when hovered over. The images are simple ones I did in Inkscape. Theoretically, all I need to do is override the CSS styles to pull out all the colors and soften the lines.
Batik has support for a user stylesheet. The problem is that the styles in the document are all inline styles and there's no easy way to override them.
One potential solution is to write a javascript to go through the document after it is loaded and pull out the inline styles. It would be relatively easy to do, but there are a couple problems:
A different tact is to simply create a new file with all of the style declarations grouped into a style
block. They would then fall under normal inheritance rules.
Programatically, this shouldn't be a terrible difficult program to write. It could be done procedurally in anything with a DOM implementation, but I am going to use XSLT. That, combined with a new style should solve the problem:
washout
parameter, a stylesheet is linked which will override the default colorsSo, you start off with a svg like this one:
Then you run:
xsltproc group_inline_styles.xslt book.svg > book.embedded-style.svg
This image doesn't look different, but the structure is different in two important ways:
style
block in image's header rather than being inlineviewBox
rather than the height
and width
attributes (so the image will scale)Inline styles cannot be overridden by document ones. To rasterize the document do:
java -jar ~/bin/batik-1.6/batik-rasterizer.jar -cssUser file://$(pwd)/washout.css -d book.embedded-washout.png -w 210 -h 155 book.embedded-style.svg
Unfortunately, Batik ignores the viewBox
and always outputs a square image when working with a height and width of 100%. Additionally, the user defined style doesn't seem to be having any effect. Perhaps embedded stylesheets take priority over external styles?
xsltproc -stringparam style_filename book.group.css group_inline_styles.xslt book.svg > book.external-style.svg
This version is like the embedded one except the styles are put in an external file: book.group.css. The rasterizing process is the same though:
java -jar ~/bin/batik-1.6/batik-rasterizer.jar -cssUser file://$(pwd)/washout.css -d book.external-washout.png -w 210 -h 155 book.external-style.svg
That also doesn't work. How about with the washout style linked to from within the document?
xsltproc -stringparam washout true group_inline_styles.xslt book.svg > book.linked-style.svg
Which, when rasterized, produces:
java -jar ~/bin/batik-1.6/batik-rasterizer.jar -d book.linked-washout.png -w 210 -h 155 book.linked-style.svg
So, apparently the cssUser
argument just doesn't work? I get the same result when working with cssAlternate
. Further testing shows that it is only the ! important
declarations that seem not to take effect.
Copies of all these commands are available in the Makefile for this page.