本文的初衷仅供自己做备忘笔记, 内容大多从网上搜集和整理, 并非都是自己原创.
参考的来源我会在后面注明, 对于可能遗漏的来源, 还请相关原创作者提醒, 非常感谢.
参考来源:
https://xmlgraphics.apache.org/batik/using/transcoder.html
通过Apache的batik实现svg转图片, 这里主要使用的batik中的Transcoder API.
transcoder API(org.apache.batik.transcoder
)主要提供了从输入到输出的转换API. 而其中的transcoder API (org.apache.batik.transcoder.image
)可以将一个SVG文档光栅化, 变成像JPEG, PNG 或TIFF这样的图片.
创建图片
下面的案例中使用JPEGTranscoder展示如何将一个SVG文档变成JPEG图片.
import java.io.*;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
public class SaveAsJPEG {
public static void main(String[] args) throws Exception {
// Create a JPEG transcoder
JPEGTranscoder t = new JPEGTranscoder();
// Set the transcoding hints.
t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8));
// Create the transcoder input.
String svgURI = new File(args[0]).toURL().toString();
TranscoderInput input = new TranscoderInput(svgURI);
// Create the transcoder output.
OutputStream ostream = new FileOutputStream("out.jpg");
TranscoderOutput output = new TranscoderOutput(ostream);
// Save the image.
t.transcode(input, output);
// Flush and close the stream.
ostream.flush();
ostream.close();
System.exit(0);
}
}
这段代码创建了一个JPEGTranscoder, 并设置了转换线索(transcoding hint). 线索中指定了编码的品质. 然后创建输入和输出流, 输入流接收来自命令行的第一个参数, 作为URI.输出流最终输出一个out.jpg文件. 最后关闭流.
然后运行:
- 代码保存为 SaveAsJPEG.java.
- 完成编译.
- 选择一个SVG文件, 然后键入如下命令:
java SaveAsJPEG filename.svg
- 检查输出的out.jpg文件.
除此以外, 程序还可以添加额外的线索(hits)来添加用户想要的样式, 比如语言或背景色.
自己实验的时候, 只用到了3个包:
batik-all-1.12.jar
/xml-apis-ext-1.3.04.jar
/xmlgraphics-commons-2.4.jar
, 其他功能还未实验, 可能会需要其他未列出的jar包.
另外如果svg的图片比较大(比如我用https://github.com/yuerLoveCoding/MySvgYuyahaoDrawChinaMap的中国地图的svg), 最终输出会只显示部分, 后来通过
hint设置JPEGTranscoder.KEY_HEIGHT
和JPEGTranscoder.KEY_WIDTH
设定图片尺寸来解决的(也许我设置的不对, 没深入研究).
官网文档里的其他功能, 比如截取/使用CSS/DOM转图片,暂未记录(挖坑)