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

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

推荐于2018-03-01 · 知道合伙人软件行家
小傻
知道合伙人软件行家
采纳数:11567 获赞数:31134
已经做过两个上架的app和两个网页项目.

向TA提问 私信TA
展开全部

   可以使用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;
    }
pensiero
推荐于2017-11-25 · TA获得超过1.1万个赞
知道大有可为答主
回答量:6921
采纳率:83%
帮助的人:1244万
展开全部
劝你还是另求它法比较好。
这些所谓图片格式(除bmp),基本上本就是压缩过的格式,而且这种压缩是有损的,象一个bmp文件压成jpg一般可以小10倍(具体要看压缩时的参数);这个动作就像你把CD音轨抓出来,比如保存成60MB的一个波形文件,压成128K采样的mp3大概就6MB。但是这个6MB的mp3再用其它压缩算法也基本上没办法再压缩了,因为本身就已经是压缩格式,按压缩算法建立词典,压缩到最后有可能反而因为建立压缩词典文件还会变大。
如果想楼主想像的那么好,各家站点、论坛还要限制大家上传的图片、头像的文件大小做什么呢?
追问
就是啊 客户提的bt需求 要求他们上传的超过2M的图片要自动给他们压缩到2M以后入库 是在不知道该怎么做了 翻遍了api也没看到合适的方法
百度了一下 有人提了个方法 没仔细看 好像是降低像素还是什么 但是会导致图片失真
追答
直接把上传图片限制为2M以下不也是解决方法么。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式