后台通过SVG生成图片

本文的初衷仅供自己做备忘笔记, 内容大多从网上搜集和整理, 并非都是自己原创.
参考的来源我会在后面注明, 对于可能遗漏的来源, 还请相关原创作者提醒, 非常感谢.

参考来源:
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文件. 最后关闭流.
然后运行:

  1. 代码保存为 SaveAsJPEG.java.
  2. 完成编译.
  3. 选择一个SVG文件, 然后键入如下命令:
    java SaveAsJPEG filename.svg
  4. 检查输出的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_HEIGHTJPEGTranscoder.KEY_WIDTH设定图片尺寸来解决的(也许我设置的不对, 没深入研究).

官网文档里的其他功能, 比如截取/使用CSS/DOM转图片,暂未记录(挖坑)

你可能感兴趣的:(后台通过SVG生成图片)