本文的初衷僅供自己做備忘筆記, 內(nèi)容大多從網(wǎng)上搜集和整理, 并非都是自己原創(chuàng).
參考的來源我會在后面注明, 對于可能遺漏的來源, 還請相關(guān)原創(chuàng)作者提醒, 非常感謝.
參考來源:
https://xmlgraphics.apache.org/batik/using/transcoder.html
通過Apache的batik實現(xiàn)svg轉(zhuǎn)圖片, 這里主要使用的batik中的Transcoder API.
transcoder API(org.apache.batik.transcoder
)主要提供了從輸入到輸出的轉(zhuǎn)換API. 而其中的transcoder API (org.apache.batik.transcoder.image
)可以將一個SVG文檔光柵化, 變成像JPEG, PNG 或TIFF這樣的圖片.
創(chuàng)建圖片
下面的案例中使用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);
}
}
這段代碼創(chuàng)建了一個JPEGTranscoder, 并設(shè)置了轉(zhuǎn)換線索(transcoding hint). 線索中指定了編碼的品質(zhì). 然后創(chuàng)建輸入和輸出流, 輸入流接收來自命令行的第一個參數(shù), 作為URI.輸出流最終輸出一個out.jpg文件. 最后關(guān)閉流.
然后運行:
- 代碼保存為 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設(shè)置JPEGTranscoder.KEY_HEIGHT
和JPEGTranscoder.KEY_WIDTH
設(shè)定圖片尺寸來解決的(也許我設(shè)置的不對, 沒深入研究).
官網(wǎng)文檔里的其他功能, 比如截取/使用CSS/DOM轉(zhuǎn)圖片,暫未記錄(挖坑)