zoukankan      html  css  js  c++  java
  • java实现图片压缩

    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等版本。

  • 相关阅读:
    字符串练习题
    js
    百度商桥--提供网站与用户之间交流平台
    git从本地上传到码云
    命名单词
    swiper 点击切换,拖动切换后继续自动轮播
    ionic4创建新项目
    两个年月日相减,获取年数和年数及半年数
    微信小程序点击跳转出现背景
    列表数据进行左浮动造成页面空白一块,排版错位问题
  • 原文地址:https://www.cnblogs.com/xu-lei/p/6442022.html
Copyright © 2011-2022 走看看