在 Java 開發中,圖片格式轉換是常見需求,例如將 JPG 轉為 PNG、BMP 轉為 GIF 等。網上相關資料雜亂不全,本文整理了三種主流實現方案,涵蓋標準庫、工具類封裝及 JAI 進階庫,助你快速掌握核心技巧。
這是最基礎、無需第三方依賴的方案,利用 javax.imageio.ImageIO 實現讀寫,支援 JPG、PNG、GIF、BMP 等常見格式互轉。
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class FormatConversion {
public static final String JPG = "jpg";
public static final String GIF = "gif";
public static final String PNG = "png";
public static final String BMP = "bmp";
public static void main(String[] args) {
String src = "E:\\2."; // 圖片路徑前綴(不含副檔名)
new FormatConversion().convert(JPG, PNG, src); // JPG → PNG
new FormatConversion().convert(JPG, GIF, src); // JPG → GIF
new FormatConversion().convert(JPG, BMP, src); // JPG → BMP
}
/**
* 通用轉換方法
* @param inputFormat 源格式
* @param outputFormat 目標格式
* @param src 文件路徑前綴
*/
public void convert(String inputFormat, String outputFormat, String src) {
try {
File input = new File(src + inputFormat);
BufferedImage image = ImageIO.read(input);
File output = new File(src + outputFormat);
ImageIO.write(image, outputFormat, output);
} catch (IOException e) {
e.printStackTrace();
}
}
}
優點:零依賴、代碼簡潔;缺點:對某些特殊格式(如 TIFF)支援有限,壓縮質量不可控。
將轉換邏輯封裝為靜態方法,調用更靈活,適合專案中復用。
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ConverterUtil {
public static final String JPG = "jpeg";
public static final String GIF = "gif";
public static final String PNG = "png";
public static final String BMP = "bmp";
/**
* 核心轉換方法
* @param imgFile 源文件
* @param format 目標格式
* @param formatFile 目標文件
*/
public static void converter(File imgFile, String format, File formatFile) throws IOException {
BufferedImage img = ImageIO.read(imgFile);
ImageIO.write(img, format, formatFile);
}
public static void main(String[] args) {
try {
File src = new File("c:\\psb.jpg");
converter(src, JPG, new File("c:\\psb2.jpg"));
converter(src, GIF, new File("c:\\psb2.gif"));
converter(src, PNG, new File("c:\\psb2.png"));
converter(src, BMP, new File("c:\\psb2.bmp"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
此方案結構清晰,便於單元測試與異常處理。
標準 ImageIO 對 TIFF 支援較弱,JAI 提供強大的編碼參數控制,適合專業圖像處理場景。
package cn.xsbiz.servlet.test;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import com.sun.media.jai.codec.BMPEncodeParam;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGEncodeParam;
public class Test {
public static void main(String[] args) throws Exception {
// TIFF → JPG
convertTiffToJpg("d:/img/a.tif", "d:/img/a.jpg");
// TIFF → BMP
convertTiffToBmp("d:/img/b.tif", "d:/img/b.bmp");
}
static void convertTiffToJpg(String input, String output) throws Exception {
RenderedOp src = JAI.create("fileload", input);
try (OutputStream os = new FileOutputStream(output)) {
JPEGEncodeParam param = new JPEGEncodeParam();
ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG", os, param);
encoder.encode(src);
}
}
static void convertTiffToBmp(String input, String output) throws Exception {
RenderedOp src = JAI.create("fileload", input);
try (OutputStream os = new FileOutputStream(output)) {
BMPEncodeParam param = new BMPEncodeParam();
ImageEncoder encoder = ImageCodec.createImageEncoder("BMP", os, param);
encoder.encode(src);
}
}
}
注意:需引入 JAI 相關 JAR 包(jai_core.jar, jai_codec.jar),且 JAI 官方已停止更新,新項目建議考慮 TwelveMonkeys ImageIO 等現代替代庫。
三段代碼各有優勢,建議根據項目實際需求選型,並在實踐中總結經驗。