利用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);
    }
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。