JAVA图片压缩代码实现

想用拍出来的照片传到部落格上当做首页的封面,无奈原照片太大了,直接放上去必定很占用带宽,于是想到了对原图进行压缩。

以下代码是在网络上查找到的,并且运行通过的

package com.wonsikin.pic;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * User: Arthur WANG
 * Date: 14-5-12
 * Time: 下午2:11
 * To change this template use File | Settings | File Templates.
 */
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;
    }

    /**
     * 获得图片大小
     * 传入参数 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!"+ "<BR>");
                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 = img.getWidth(null);
                    newHeight = img.getHeight(null);
                }
                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 e){
            e.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 compressPicDemo(String inputDir, String outputDir, String inputFileName, String outputFileName, int outputWidth, int outputHeight, boolean proportion) {
        this.inputDir = inputDir;
        this.outputDir = outputDir;
        this.inputFileName = inputFileName;
        this.outputFileName = outputFileName;
        setWidthAndHeight(outputWidth,outputHeight);
        this.proportion = proportion;

        return compressPic();

    }

    public static void main(String[] args){
        CompressPicDemo mypic = new CompressPicDemo();
        System.out.println("Start");
        mypic.compressPicDemo("C:\\","C:\\test\\","1.jpg","r2.jpg",1366,960, false);
    }
}

原文链接: 可乐加糖 & COLA