本文的初衷僅供自己做備忘筆記, 內(nèi)容大多從網(wǎng)上搜集和整理, 并非都是自己原創(chuàng).
參考的來(lái)源我會(huì)在后面注明, 對(duì)于可能遺漏的來(lái)源, 還請(qǐng)相關(guān)原創(chuàng)作者提醒, 非常感謝.
參考來(lái)源:
https://xmlgraphics.apache.org/batik/using/transcoder.html
通過(guò)Apache的batik實(shí)現(xiàn)svg轉(zhuǎn)圖片, 這里主要使用的batik中的Transcoder API.
transcoder API(org.apache.batik.transcoder)主要提供了從輸入到輸出的轉(zhuǎn)換API. 而其中的transcoder API (org.apache.batik.transcoder.image)可以將一個(gè)SVG文檔光柵化, 變成像JPEG, PNG 或TIFF這樣的圖片.
創(chuàng)建圖片
下面的案例中使用JPEGTranscoder展示如何將一個(gè)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);
}
}
這段代碼創(chuàng)建了一個(gè)JPEGTranscoder, 并設(shè)置了轉(zhuǎn)換線索(transcoding hint). 線索中指定了編碼的品質(zhì). 然后創(chuàng)建輸入和輸出流, 輸入流接收來(lái)自命令行的第一個(gè)參數(shù), 作為URI.輸出流最終輸出一個(gè)out.jpg文件. 最后關(guān)閉流.
然后運(yùn)行:
- 代碼保存為 SaveAsJPEG.java.
- 完成編譯.
- 選擇一個(gè)SVG文件, 然后鍵入如下命令:
java SaveAsJPEG filename.svg - 檢查輸出的out.jpg文件.
除此以外, 程序還可以添加額外的線索(hits)來(lái)添加用戶想要的樣式, 比如語(yǔ)言或背景色.
自己實(shí)驗(yàn)的時(shí)候, 只用到了3個(gè)包:
batik-all-1.12.jar/xml-apis-ext-1.3.04.jar/xmlgraphics-commons-2.4.jar, 其他功能還未實(shí)驗(yàn), 可能會(huì)需要其他未列出的jar包.
另外如果svg的圖片比較大(比如我用https://github.com/yuerLoveCoding/MySvgYuyahaoDrawChinaMap的中國(guó)地圖的svg), 最終輸出會(huì)只顯示部分, 后來(lái)通過(guò)
hint設(shè)置JPEGTranscoder.KEY_HEIGHT和JPEGTranscoder.KEY_WIDTH設(shè)定圖片尺寸來(lái)解決的(也許我設(shè)置的不對(duì), 沒(méi)深入研究).
官網(wǎng)文檔里的其他功能, 比如截取/使用CSS/DOM轉(zhuǎn)圖片,暫未記錄(挖坑)