Java圖片上傳壓縮處理

來源:互聯網
上載者:User

原文連結:http://www.javaeye.com/topic/266585

1、圖片格式

    JAVA的API很好,com.sun.image.codec.jpeg.JPEGCodec和com.sun.image.codec.jpeg.JPEGImageEncoder 這兩個類基本上自動解決了類型轉換的問題,可以正常實現bmp轉jpg、png轉jpg、gif轉jpg但是暫時還沒有解決gif轉gif的功能。

    2、畫面品質的問題

    BufferedImage tag = new BufferedImage((int)newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);

    // Image.SCALE_SMOOTH 的縮減演算法 產生縮圖片的平滑度的 優先順序比速度高 產生的圖片品質比較好 但速度慢

    tag.getGraphics().drawImage(img.getScaledInstance(newWidth,
newHeight, Image.SCALE_SMOOTH), 0, 0, null);

    3、壓縮速度

    測試36MB的bmp圖片(8192*6144)壓縮成(160*120)的jpg的5KB圖片,只需要2-3秒的時間。批量處理100張(1027*768)的bmp映像,轉換成(120*80)的jpg圖片總共只需要17秒。

    4、根據使用者喜好選擇壓縮模式

    按比例或者按規定尺寸

    //compressPic(大圖片路徑,產生小圖片路徑,大圖片檔案名稱,產生小圖片文名,產生小圖片寬度,產生小圖片高度,是否等比縮放(預設為true))

    以下是源碼,如覺得可以更加完善的話,希望大家可以提供點意見!!

/** *  縮圖實現,將圖片(jpg、bmp、png、gif等等)真實的變成想要的大小 */package com.joewalker.test; import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder; /******************************************************************************* * 縮圖類(通用) 本java類能將jpg、bmp、png、gif圖片檔案,進行等比或非等比的大小轉換。 具體使用方法 * compressPic(大圖片路徑,產生小圖片路徑,大圖片檔案名稱,產生小圖片文名,產生小圖片寬度,產生小圖片高度,是否等比縮放(預設為true)) */ public class CompressPicDemo { private File file = null; // 檔案對象 private String inputDir; // 輸入圖路徑 private String outputDir; // 輸出圖路徑 private String inputFileName; // 輸入圖檔案名稱 private String outputFileName; // 輸出圖檔案名稱 private int outputWidth = 100; // 預設輸出圖片寬 private int outputHeight = 100; // 預設輸出圖片高 private boolean proportion = true; // 是否等比縮放標記(預設為等比縮放) public CompressPicDemo() { // 初始設定變數 inputDir = ""; outputDir = ""; inputFileName = ""; outputFileName = ""; outputWidth = 100; outputHeight = 100; } public void setInputDir(String inputDir) { this.inputDir = inputDir; } public void setOutputDir(String outputDir) { this.outputDir = outputDir; } public void setInputFileName(String inputFileName) { this.inputFileName = inputFileName; } public void setOutputFileName(String outputFileName) { this.outputFileName = outputFileName; } public void setOutputWidth(int outputWidth) { this.outputWidth = outputWidth; } public void setOutputHeight(int outputHeight) { this.outputHeight = outputHeight; } public void setWidthAndHeight(int width, int height) { this.outputWidth = width; this.outputHeight = height; }   /*  * 獲得圖片大小  * 傳入參數 String path :圖片路徑  */ public long getPicSize(String path) { file = new File(path); return file.length(); }  // 圖片處理 public String compressPic() { try { //獲得源檔案 file = new File(inputDir + inputFileName); if (!file.exists()) { return ""; } Image img = ImageIO.read(file); // 判斷圖片格式是否正確 if (img.getWidth(null) == -1) { System.out.println(" can't read,retry!" + ""); return "no"; } else { int newWidth; int newHeight; // 判斷是否是等比縮放 if (this.proportion == true) { // 為等比縮放計算輸出的圖片寬度及高度 double rate1 = ((double) img.getWidth(null)) / (double) outputWidth + 0.1; double rate2 = ((double) img.getHeight(null)) / (double) outputHeight + 0.1; // 根據縮放比率大的進行縮放控制 double rate = rate1 > rate2 ? rate1 : rate2; newWidth = (int) (((double) img.getWidth(null)) / rate); newHeight = (int) (((double) img.getHeight(null)) / rate); } else { newWidth = outputWidth; // 輸出的圖片寬度 newHeight = outputHeight; // 輸出的圖片高度 } BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);   /* * Image.SCALE_SMOOTH 的縮減演算法 產生縮圖片的平滑度的 * 優先順序比速度高 產生的圖片品質比較好 但速度慢 */ tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null); FileOutputStream out = new FileOutputStream(outputDir + outputFileName); // JPEGImageEncoder可適用於其他圖片類型的轉換 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); out.close(); } } catch (IOException ex) { ex.printStackTrace(); } return "ok";} public String compressPic (String inputDir, String outputDir, String inputFileName, String outputFileName) { // 輸入圖路徑 this.inputDir = inputDir; // 輸出圖路徑 this.outputDir = outputDir; // 輸入圖檔案名稱 this.inputFileName = inputFileName; // 輸出圖檔案名稱 this.outputFileName = outputFileName; return compressPic(); } public String compressPic(String inputDir, String outputDir, String inputFileName, String outputFileName, int width, int height, boolean gp) { // 輸入圖路徑 this.inputDir = inputDir; // 輸出圖路徑 this.outputDir = outputDir; // 輸入圖檔案名稱 this.inputFileName = inputFileName; // 輸出圖檔案名稱 this.outputFileName = outputFileName; // 設定圖片長寬 setWidthAndHeight(width, height); // 是否是等比縮放 標記 this.proportion = gp; return compressPic(); }   // main測試 // compressPic(大圖片路徑,產生小圖片路徑,大圖片檔案名稱,產生小圖片文名,產生小圖片寬度,產生小圖片高度,是否等比縮放(預設為true)) public static void main(String[] arg) { CompressPicDemo mypic = new CompressPicDemo(); System.out.println("輸入的圖片大小:" + mypic.getPicSize("e:\\1.jpg")/1024 + "KB"); int count = 0; // 記錄全部圖片壓縮所用時間 for (int i = 0; i < 100; i++) { int start = (int) System.currentTimeMillis();// 開始時間 mypic.compressPic("e:\\", "e:\\test\\", "1.jpg", "r1"+i+".jpg", 120, 120, true); int end = (int) System.currentTimeMillis(); // 結束時間 int re = end-start; // 但圖片產生處理時間 count += re; System.out.println("第" + (i+1) + "張圖片壓縮處理使用了: " + re + "毫秒"); System.out.println("輸出的圖片大小:" + mypic.getPicSize("e:\\test\\r1"+i+".jpg")/1024 + "KB"); } System.out.println("總共用了:" + count + "毫秒"); } }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.