后臺通過SVG生成圖片

本文的初衷僅供自己做備忘筆記, 內(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)閉流.
然后運行:

  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設(shè)置JPEGTranscoder.KEY_HEIGHTJPEGTranscoder.KEY_WIDTH設(shè)定圖片尺寸來解決的(也許我設(shè)置的不對, 沒深入研究).

官網(wǎng)文檔里的其他功能, 比如截取/使用CSS/DOM轉(zhuǎn)圖片,暫未記錄(挖坑)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夯尽,一起剝皮案震驚了整個濱河市届案,隨后出現(xiàn)的幾起案子署浩,更是在濱河造成了極大的恐慌鸟缕,老刑警劉巖棠涮,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箫老,死亡現(xiàn)場離奇詭異昔榴,居然都是意外死亡妓肢,警方通過查閱死者的電腦和手機捌省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碉钠,“玉大人纲缓,你說我怎么就攤上這事『胺希” “怎么了祝高?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長污筷。 經(jīng)常有香客問我工闺,道長,這世上最難降的妖魔是什么瓣蛀? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任斤寂,我火速辦了婚禮,結(jié)果婚禮上揪惦,老公的妹妹穿的比我還像新娘遍搞。我一直安慰自己,他們只是感情好器腋,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布溪猿。 她就那樣靜靜地躺著,像睡著了一般纫塌。 火紅的嫁衣襯著肌膚如雪诊县。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天措左,我揣著相機與錄音依痊,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛胸嘁,可吹牛的內(nèi)容都是我干的瓶摆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼性宏,長吁一口氣:“原來是場噩夢啊……” “哼群井!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毫胜,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤书斜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酵使,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荐吉,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡口渔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年样屠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搓劫。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枪向,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情负蠕,我是刑警寧澤倦畅,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布遮糖,位于F島的核電站叠赐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芭概。R本人自食惡果不足惜赛不,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罢洲。 院中可真熱鬧踢故,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至斜脂,卻和暖如春抓艳,著一層夾襖步出監(jiān)牢的瞬間触机,已是汗流浹背帚戳。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留儡首,地道東北人片任。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蔬胯,于是被迫代替她去往敵國和親对供。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容