求助java压缩图片存储大小的方法

需要在代码里处理上传图片的存储大小(不是图片尺寸,图片尺寸已处理),如1M压缩到500KB,求高人指点方法
就常规的几种图片格式吧jpg/jpeg,bmp,gif,png

   å¯ä»¥ä½¿ç”¨Draw这个类,通过改变像素来改变存储大小,实例如下:

public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException {
        File file = null;
        BufferedImage src = null;
        FileOutputStream out = null;
        ImageWriter imgWrier;
        ImageWriteParam imgWriteParams;

        // æŒ‡å®šå†™å›¾ç‰‡çš„方式为 jpg
        imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();
        imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(
                null);
        // è¦ä½¿ç”¨åŽ‹ç¼©ï¼Œå¿…须指定压缩方式为MODE_EXPLICIT
        imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);
        // è¿™é‡ŒæŒ‡å®šåŽ‹ç¼©çš„程度,参数qality是取值0~1范围内,
        imgWriteParams.setCompressionQuality((float) 1);
        imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
        ColorModel colorModel =ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault();
        // æŒ‡å®šåŽ‹ç¼©æ—¶ä½¿ç”¨çš„色彩模式
//        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
//                colorModel, colorModel.createCompatibleSampleModel(16, 16)));
        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
                colorModel, colorModel.createCompatibleSampleModel(16, 16)));

        try {
            if (isBlank(srcFilePath)) {
                return false;
            } else {
                file = new File(srcFilePath);System.out.println(file.length());
                src = ImageIO.read(file);
                out = new FileOutputStream(descFilePath);

                imgWrier.reset();
                // å¿…须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何
                // OutputStream构造
                imgWrier.setOutput(ImageIO.createImageOutputStream(out));
                // è°ƒç”¨write方法,就可以向输入流写图片
                imgWrier.write(null, new IIOImage(src, null, null),
                        imgWriteParams);
                out.flush();
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
public static boolean isBlank(String string) {
        if (string == null || string.length() == 0 || string.trim().equals("")) {
            return true;
        }
        return false;
    }
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-25
劝你还是另求它法比较好。
这些所谓图片格式(除bmp),基本上本就是压缩过的格式,而且这种压缩是有损的,象一个bmp文件压成jpg一般可以小10倍(具体要看压缩时的参数);这个动作就像你把CD音轨抓出来,比如保存成60MB的一个波形文件,压成128K采样的mp3大概就6MB。但是这个6MB的mp3再用其它压缩算法也基本上没办法再压缩了,因为本身就已经是压缩格式,按压缩算法建立词典,压缩到最后有可能反而因为建立压缩词典文件还会变大。
如果想楼主想像的那么好,各家站点、论坛还要限制大家上传的图片、头像的文件大小做什么呢?追问

就是啊 客户提的bt需求 要求他们上传的超过2M的图片要自动给他们压缩到2M以后入库 是在不知道该怎么做了 翻遍了api也没看到合适的方法
百度了一下 有人提了个方法 没仔细看 好像是降低像素还是什么 但是会导致图片失真

追答

直接把上传图片限制为2M以下不也是解决方法么。

本回答被提问者采纳
相似回答