首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 圖片格式轉換實戰:三種核心實現方案完整解析

     編輯:Java 相關知識

前言

在 Java 開發中,圖片格式轉換是常見需求,例如將 JPG 轉為 PNG、BMP 轉為 GIF 等。網上相關資料雜亂不全,本文整理了三種主流實現方案,涵蓋標準庫、工具類封裝及 JAI 進階庫,助你快速掌握核心技巧。

方案一:基於 ImageIO 的標準轉換類

這是最基礎、無需第三方依賴的方案,利用 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)支援有限,壓縮質量不可控。

方案二:靜態工具類封裝,支援 File 對象直接操作

將轉換邏輯封裝為靜態方法,調用更靈活,適合專案中復用。

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();
        }
    }
}

此方案結構清晰,便於單元測試與異常處理。

方案三:基於 JAI (Java Advanced Imaging) 處理 TIFF 等專業格式

標準 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 等現代替代庫。

總結與建議

  • 簡單項目:首選方案一或二,無額外依賴,維護成本低。
  • 專業圖像處理:方案三可精細控制壓縩參數,但依賴較重。
  • 現代替代:推薦 TwelveMonkeys ImageIO,擴展格式支援極佳,API 與 ImageIO 兼容。

三段代碼各有優勢,建議根據項目實際需求選型,並在實踐中總結經驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved