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

Java 影像處理:JPEG 縮圖與檔案大小優化

     編輯:Java 相關知識

應用場景

使用者上傳高解析度照片 (如 300 萬畫素 ~600KB+),直接顯示頻寬負擔大。伺服端自動產生縮圖可大幅改善體驗。

前置條件

  • JDK 1.4+ (內建 ImageIO)。
  • 支援格式:JPEG、GIF、PNG。

核心程式碼 (縮小 50%)

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class JpgResizer {
    public void resizeHalf(File srcFile, File destFile) throws Exception {
        // 1. 讀取原圖
        Image src = ImageIO.read(srcFile);
        int w = src.getWidth(null);
        int h = src.getHeight(null);

        // 2. 建立目標 BufferedImage
        BufferedImage tag = new BufferedImage(w/2, h/2, BufferedImage.TYPE_INT_RGB);
        tag.getGraphics().drawImage(src, 0, 0, w/2, h/2, null);

        // 3. JPEG 編碼輸出
        try (FileOutputStream out = new FileOutputStream(destFile)) {
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag);
        }
    }
}

注意事項

  • 記憶體限制:原圖解碼為位圖佔用大量堆疊記憶體,建議單檔 < 1MB (1.8MB 實測可行但易 OOM)。
  • 解決大圖策略:
    • 分塊編碼:改寫 Encoder,分段寫入臨時檔。
    • NIO 記憶體映射:FileChannel.map() 避免全量載入。
    • 使用 JMagick (ImageMagick Java 封裝) 等成熟開源庫,支援串流處理。
  • com.sun.image.codec.jpeg 為 Sun 專有 API,跨 JDK 版本可能不穩,生產環境建議改用 ImageIO.write(img, "jpg", out) 或 TwelveMonkeys ImageIO 外掛。

延伸應用

同樣原理可實現:旋轉、裁切、水印、格式轉換、品質壓縮等。若需企業級影像處理管線,建議評估 JMagick、TwelveMonkeys ImageIO、Apache Sanselan 等庫。

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