如何在Apache Batik SVG 1.8中将shape-rendering属性设为crispEdges
问题描述
我希望Apache Batik 1.8在输出的根<svg />节点中生成:
shape-rendering="crispEdges"
而非默认的:
shape-rendering="auto"
我已经找到了SVGConstants.SVG_SHAPE_RENDERING_ATTRIBUTE和SVGConstants.SVG_CRISP_EDGES_VALUE两个常量,但不知道怎么把这个属性设置到SVGGraphics2D实例上。
我尝试给SVGGraphics2D实例做如下操作:
//svgGraphics.setRenderingHint(SVGRenderingHints.SVG_SHAPE_RENDERING_ATTRIBUTE, // SVGRenderingHints.SVG_CRISP_EDGES_VALUE);
但SVGGraphics2D.setRenderingHints方法要求传入的是java.awt.RenderingHints类型的参数。
我也试过下面的写法:
svgGraphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); svgGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); svgGraphics.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); svgGraphics.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
但这些操作都没有把输出SVG文件里的render-style属性改成crispEdges。
(我目前在研究Document类,想通过XML/字符串手动改这个属性,也在源码里找到了几个相关类,但没找到合适的示例或者测试用例)
请问把shape-rendering改成crispEdges最优雅的实现方式是什么?
解决方案
最省事也最清晰的实现方式就是绘制完成后直接操作SVGGraphics2D绑定的DOM节点,不用改Batik底层配置,也不用手动拼字符串改SVG代码,改几行代码就行。
你正常写完所有绘制逻辑之后,加两行代码拿根节点设属性就完事:
import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; // 你原来的绘制代码 SVGGraphics2D svgGraphics = new SVGGraphics2D(document); // ... 所有绘制内容 ... // 新增下面两行 Element rootSvg = svgGraphics.getRoot(); rootSvg.setAttribute(SVGConstants.SVG_SHAPE_RENDERING_ATTRIBUTE, SVGConstants.SVG_CRISP_EDGES_VALUE); // 后续正常输出SVG就行
你之前试的RenderingHints是用来控制Batik自身渲染成位图的时候的效果参数,不会写到输出的SVG文件里,所以肯定不生效。
如果是要批量给所有生成的SVG都加这个属性,才需要去自定义SVGGeneratorContext的配置,普通场景上面的方法完全够用。
内容的提问来源于stack exchange,提问作者George Profenza

