public class ImgZipUtils {

    /** 
     * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩 
     * @param imgsrc 源图片地址 
     * @param imgdist 目标图片地址 
     * @param widthdist 压缩后图片宽度(当rate==null时,必传) 
     * @param heightdist 压缩后图片高度(当rate==null时,必传) 
     * @param rate 压缩比例  
     */  
    public static void reduceImg(String imgsrc, String imgdist, int widthdist,  
            int heightdist, Float rate) {  
        try {  
            File srcfile = new File(imgsrc);  
            // 检查文件是否存在  
            if (!srcfile.exists()) {  
                return;  
            }  
            // 如果rate不为空说明是按比例压缩  
            if (rate != null && rate > 0) {  
                // 获取文件高度和宽度  
                int[] results = getImgWidth(srcfile);  
                if (results == null || results[0] == 0 || results[1] == 0) {  
                    return;  
                } else {  
                    widthdist = (int) (results[0] * rate);  
                    heightdist = (int) (results[1] * rate);  
                }  
            }  
            // 开始读取文件并进行压缩  
            Image src = javax.imageio.ImageIO.read(srcfile);  
            BufferedImage tag = new BufferedImage((int) widthdist,  
                    (int) heightdist, BufferedImage.TYPE_INT_RGB);  
  
            tag.getGraphics().drawImage(  
                    src.getScaledInstance(widthdist, heightdist,  
                            Image.SCALE_SMOOTH), 0, 0, null);  
  
            FileOutputStream out = new FileOutputStream(imgdist);  
//如果使用的是jdk1.6以上版本,请使用下面的新方法。
//          JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
//          encoder.encode(tag);  
//          out.close();  
            // 新的方法
            int dpi = 300;//分辨率
            saveAsJPEG(dpi, tag, rate, out);
            //关闭输出流
            out.close();
        } catch (IOException ex) {  
            ex.printStackTrace();  
        }  
    }
    
    /** 
     * 获取图片宽度 
     *  
     * @param file 
     *            图片文件 
     * @return 宽度 
     */  
    public static int[] getImgWidth(File file) {  
        InputStream is = null;  
        BufferedImage src = null;  
        int result[] = { 0, 0 };  
        try {  
            is = new FileInputStream(file);  
            src = javax.imageio.ImageIO.read(is);  
            result[0] = src.getWidth(null); // 得到源图宽  
            result[1] = src.getHeight(null); // 得到源图高  
            is.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return result;  
    }  
    
    
    /**
     * 以JPEG编码保存图片
     * 
     * @param dpi
     *            分辨率
     * @param image_to_save
     *            要处理的图像图片
     * @param JPEGcompression
     *            压缩比
     * @param fos
     *            文件输出流
     * @throws IOException
     */
    public static void saveAsJPEG(Integer dpi, BufferedImage image_to_save,
            float JPEGcompression, FileOutputStream fos) throws IOException {

        // Image writer
        JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO
                .getImageWritersBySuffix("jpg").next();
        ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
        imageWriter.setOutput(ios);
        // and metadata
        IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(
                new ImageTypeSpecifier(image_to_save), null);

        if (JPEGcompression >= 0 && JPEGcompression <= 1f) {

            JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter
                    .getDefaultWriteParam();
            jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
            jpegParams.setCompressionQuality(JPEGcompression);

        }

        imageWriter.write(imageMetaData,
                new IIOImage(image_to_save, null, null), null);
        ios.close();
        imageWriter.dispose();

    }
    
    public static void main(String[] args) {  
        /** 
         * d://3.jpg 源图片 
         * d://31.jpg 目标图片 
         * 压缩宽度和高度都是1000 
         *  
         */  
        System.out.println("压缩图片开始...");  
        File srcfile = new File("e://1.jpg");  
        System.out.println("压缩前srcfile size:" + srcfile.length());  
        reduceImg("e://1.jpg", "e://2.jpg", 1000,1000,(float)0.3);  
        File distfile = new File("e://2.jpg");  
        System.out.println("压缩后distfile size:" + distfile.length());  
      
    }  
}

支持按比例压缩,指定尺寸大小压缩,支持java1.6,1.7等版本。