import java.awt.Dimension; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; import java.io.File; import javax.imageio.ImageIO; /** * JPG圖片壓縮工具 * @author clj * */ public class ImageUtil { /** * 將原圖src壓縮後存入des中 * @param src 原圖片文件 * @param des 壓縮後的存儲文件 * @param imgSize 圖片縮放的最大尺寸 * @param quality 圖片質量0~1 */ public static void compress(File src,File des, int imgSize,float quality) { FileOutputStream out = null; try { //讀取源圖片到內存中 Image image = ImageIO.read(src); //得到壓縮尺寸 Dimension dim = getRectangle(image.getWidth(null), image.getHeight(null),imgSize); //在內存中建立壓縮圖片的緩衝區 BufferedImage tmpImg=new BufferedImage(dim.width,dim.height ,BufferedImage.TYPE_3BYTE_BGR); //在緩衝區按縮放後的大小繪製壓縮圖片 tmpImg.getGraphics().drawImage(image.getScaledInstance(dim.width,dim.height,Image.SCALE_SMOOTH), 0, 0, null); //設置圖片質量, JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tmpImg); jep.setQuality(quality, true); //保存壓縮圖片 //輸出圖片存在則先刪除 if(des.exists()){ des.delete(); } //得到輸出流 out = new FileOutputStream(des); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tmpImg); } catch (Exception ex) { ex.printStackTrace(); }finally{ try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 得到壓縮圖片尺寸 * 最長邊壓縮爲size px,短邊按比例變化 * @param width * @param height * @return */ private static Dimension getRectangle( int width, int height, int size){ Dimension dim = new Dimension(); double w = width+0.0; double h = height + 0.0; double rate = w/h; //寬或高大於size時,將較大者縮小爲size,較小者則按比例變化 if(w > h && w > size){ w = size; h = w / rate; }else if(h > w && h > size){ h = size; w = h*rate; } width = (int)w; height = (int)h; dim.width = width; dim.height = height; return dim; } public static void main(String args[]){ ImageUtil.compress(new File("D:/test/img/src.jpg"), new File("D:/test/img/out.jpg"),600,1f); } }