当前位置 博文首页 > RemainderTime:工具方法(一)- java等比例缩放图片大小(完美

    RemainderTime:工具方法(一)- java等比例缩放图片大小(完美

    作者:[db:作者] 时间:2021-07-12 21:44

    业务需求:对大于200kb的图片进行等比例缩放到100kb以内

    实现

    注: 等比例缩放图片大小方法在第(3)步

    • (1) 业务方法实现
    //对大于200kb的图片进行等比例缩放到100kb以内
    public void compressionImg(){
    ...
    //原图片路径
    String oldUrl = "D:/xx.jpg"
    //缩放后图片路径
    String newUrl= "D:/xx_s.jpg"
    File file =new File(old);
    	if(file.isFile()){
    		//获取图片大小
    	    long length = file.length();
    	    //将字节转换为kb
    	    float v = this.bytes2kb(length);
    	    log.info("图片大小:"+v+"kb");
    	}
    	if(v>=200){
    		//等比例缩放图片  指定宽度缩放像素 500px
            reduceImg(oldUrl,newUrl,500);
    	}
    }
    
    
    • (2)获取图片大小 (kb)方法
        /**
         * 获取图片大小 kb
         *
         * @param bytes  字节
         * @return
         */
    public float bytes2kb(long bytes) {
         BigDecimal filesize = new BigDecimal(bytes);
         BigDecimal kilobyte = new BigDecimal(1024);
         float  returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP)
                 .floatValue();
         return returnValue;
     }
    
    • (3)等比率缩放方法
    /**
     * 等比率缩放
     * @param imgsrc  原图片路径
     * @param imgdist  缩放图片路径
     * @param widthdist 指定缩放宽度
     */
    public static void reduceImg(String imgsrc, String imgdist, int widthdist) {
        try {
            File srcfile = new File(imgsrc);
            if (!srcfile.exists()) {
                return;
            }
            //获取图片对象
            Image src = javax.imageio.ImageIO.read(srcfile);
            //获取缩放比率因子,保留2位小数
            double  factor = new BigDecimal((float)widthdist/src.getWidth(null)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            //获取缩放后的高度
            double  height = src.getHeight(null)*factor;
            //缓存图片对象
            BufferedImage tag= new BufferedImage((int) widthdist, (int) height,
                    BufferedImage.TYPE_INT_RGB);
            //绘制图片
            tag.getGraphics().drawImage(src.getScaledInstance(widthdist, (int) height,  Image.SCALE_SMOOTH), 0, 0, null);
            //获取输入流对象
            FileOutputStream out = new FileOutputStream(imgdist);
            //图片编码器
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag);
            out.close();
    
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    
    cs