Java使用Apache Batik實(shí)現(xiàn)將SVG轉(zhuǎn)換為PNG
在項(xiàng)目中經(jīng)常需要將 SVG 圖標(biāo)或圖形轉(zhuǎn)換為 PNG 格式,比如生成固定尺寸的 favicon、圖標(biāo)等。Apache Batik 是一個(gè)強(qiáng)大的 SVG 處理庫(kù),可以輕松實(shí)現(xiàn) SVG → PNG 的轉(zhuǎn)換。
本文介紹一種簡(jiǎn)單可靠的方法:通過(guò)網(wǎng)絡(luò) URL 獲取 SVG,并轉(zhuǎn)換為指定寬高的 PNG 文件。
1. 添加 Maven 依賴(lài)
在 pom.xml 中添加 Apache Batik 依賴(lài)(推薦使用較新版本):
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.17</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-codec</artifactId>
<version>1.17</version>
</dependency>
注意:Batik 不同模塊需要一起引入,batik-transcoder 負(fù)責(zé)轉(zhuǎn)換,batik-codec 提供 PNG 編碼支持。
2. 核心轉(zhuǎn)換代碼
創(chuàng)建一個(gè)工具類(lèi),直接提供一個(gè)靜態(tài)方法即可調(diào)用:
import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
public class SvgToPngConverter {
/**
* 將網(wǎng)絡(luò)上的 SVG 轉(zhuǎn)換為指定寬高的 PNG
*
* @param svgUrl SVG 文件的 URL
* @param pngFilePath 輸出的 PNG 文件路徑
* @param width 目標(biāo)寬度(像素)
* @param height 目標(biāo)高度(像素)
* @throws IOException IO 異常
* @throws TranscoderException 轉(zhuǎn)換異常
*/
public static void convertSvgToPng(String svgUrl, String pngFilePath, int width, int height)
throws IOException, TranscoderException {
// 1. 打開(kāi)網(wǎng)絡(luò)連接獲取 SVG 輸入流
URL url = new URL(svgUrl);
URLConnection connection = url.openConnection();
try (InputStream inputStream = connection.getInputStream();
OutputStream outputStream = new FileOutputStream(pngFilePath)) {
// 2. 創(chuàng)建 PNG 轉(zhuǎn)換器
Transcoder transcoder = new PNGTranscoder();
// 3. 設(shè)置目標(biāo)寬高(關(guān)鍵?。?
transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) width);
transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) height);
// 4. 設(shè)置輸入和輸出
TranscoderInput input = new TranscoderInput(inputStream);
TranscoderOutput output = new TranscoderOutput(outputStream);
// 5. 執(zhí)行轉(zhuǎn)換
transcoder.transcode(input, output);
}
// try-with-resources 會(huì)自動(dòng)關(guān)閉流
}
// 測(cè)試調(diào)用示例
public static void main(String[] args) {
try {
String svgUrl = "https://example.com/favicons/favicon.svg";
String pngPath = "favicon_64.png";
convertSvgToPng(svgUrl, pngPath, 64, 64);
System.out.println("SVG 轉(zhuǎn)換為 PNG 成功!輸出文件:" + pngPath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 代碼說(shuō)明
網(wǎng)絡(luò)獲取 SVG:通過(guò) URLConnection 獲取輸入流,支持任何公開(kāi)的 SVG URL。
指定寬高:使用 PNGTranscoder.KEY_WIDTH 和 KEY_HEIGHT 提示,確保輸出 PNG 為指定尺寸(會(huì)等比例縮放并居中)。
資源自動(dòng)關(guān)閉:使用 try-with-resources,避免資源泄漏。
異常處理:建議在實(shí)際項(xiàng)目中記錄日志,而不是靜默吞異常。
4. 運(yùn)行效果
運(yùn)行 main 方法后,會(huì)在項(xiàng)目根目錄生成 favicon_64.png,大小正好是 64×64 像素。
5. 常見(jiàn)問(wèn)題
轉(zhuǎn)換后圖像空白:檢查 SVG URL 是否有效、是否支持 CORS(Batik 直接讀流通常沒(méi)問(wèn)題)。
尺寸不準(zhǔn):確保傳入的 width/height 是 float 類(lèi)型(Batik 要求)。
本地 SVG 文件:如果不是網(wǎng)絡(luò) URL,可直接用 new FileInputStream("local.svg") 替換輸入流。
這個(gè)方法簡(jiǎn)單高效,無(wú)需額外圖形庫(kù),適合后端服務(wù)批量生成圖標(biāo)。如果有更多需求(如添加背景、水?。梢栽?Batik 基礎(chǔ)上擴(kuò)展。
到此這篇關(guān)于Java使用Apache Batik實(shí)現(xiàn)將SVG轉(zhuǎn)換為PNG的文章就介紹到這了,更多相關(guān)Java SVG轉(zhuǎn)PNG內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用Graphics2D繪制SVG和PNG的方法
- 使用Java將Word文件轉(zhuǎn)換為PNG圖片的詳細(xì)步驟
- java實(shí)現(xiàn)圖片格式轉(zhuǎn)換(PNG轉(zhuǎn)BMP)
- Java實(shí)現(xiàn)PNG圖片格式轉(zhuǎn)BMP圖片格式
- Java實(shí)現(xiàn)PDF轉(zhuǎn)HTML/Word/Excel/PPT/PNG的示例代碼
- Java實(shí)現(xiàn)將png格式圖片轉(zhuǎn)換成jpg格式圖片的方法【測(cè)試可用】
- Java快速實(shí)現(xiàn)Excel表格轉(zhuǎn)SVG的示例詳解
- Java 將Excel轉(zhuǎn)為SVG的方法
相關(guān)文章
SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(Spring方式)
今天給大家分享一個(gè)SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(Spring方式),WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Spring Boot Actuator端點(diǎn)相關(guān)原理解析
這篇文章主要介紹了Spring Boot Actuator端點(diǎn)相關(guān)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Mybatis查詢(xún)語(yǔ)句返回對(duì)象和泛型集合的操作
這篇文章主要介紹了Mybatis查詢(xún)語(yǔ)句返回對(duì)象和泛型集合的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
java使用反射創(chuàng)建并操作對(duì)象的方法
這篇文章主要介紹了java使用反射創(chuàng)建并操作對(duì)象的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
Java異常(Exception)處理以及常見(jiàn)異??偨Y(jié)
在《Java編程思想》中這樣定義異常,阻止當(dāng)前方法或作用域繼續(xù)執(zhí)行的問(wèn)題,雖然java中有異常處理機(jī)制,但是要明確一點(diǎn),決不應(yīng)該用"正常"的態(tài)度來(lái)看待異常,這篇文章主要給大家介紹了關(guān)于Java異常(Exception)處理以及常見(jiàn)異常的相關(guān)資料,需要的朋友可以參考下2021-10-10
Java JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)(Run-Time Data Areas)
運(yùn)行時(shí)數(shù)據(jù)區(qū),是java虛擬機(jī)定義的在程序執(zhí)行期間使用的各種運(yùn)行時(shí)的數(shù)據(jù)區(qū),通過(guò)JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)圖例給大家展示的很詳細(xì),對(duì)JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2021-06-06

