利用JPEGImageEncoder進行簡單的圖片壓縮

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);
    }
}
相關文章
相關標籤/搜索