高山_流水
海阔凭鱼跃,天高任鸟飞
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等版本。

posted on 2017-02-25 15:56  高山_流水  阅读(324)  评论(0编辑  收藏  举报