处理图片压缩的终极版本。附上测试用例。

/*** * 压缩图片,并等比缩小。* * @author aren* @param data*            输入图片数据的byte[]。* @param width*            最大输出宽度,但是最后会根据图片本身比例调整。推荐值800。* @param height*            最大输出高度,但是最后会根据图片本身比例调整。推荐值600。* @param type*            指定最后存储的图片类型,支持字符串jpg,png,gif,bmp,jpeg。如果为null,则默认输出jpg格式图片。* @param maxSize*            指定最大输出图片的容量大小。可以为null表示不指定压缩容量大小。不要小于10000,推荐100000。* @return 输出图片数据的byte[]。* @throws Exception*/public byte[] zipImageToScaledSize(byte[] data, int width, int height, String type, Integer maxSize)throws Exception {if (data == null) {return null;}if (width <= 0 || height <= 0) {width = 800;height = 600;}// 设定输出格式String[] supportType = new String[] { "jpg", "png", "bmp", "jpeg", "gif" };if (type == null || !ArrayUtils.contains(supportType, type)) {type = "jpg";}int pointedHeight;int pointedWidth;ByteArrayInputStream inputStream = new ByteArrayInputStream(data);BufferedImage bufferedImage = ImageIO.read(inputStream);inputStream.close();int originalHeight = bufferedImage.getHeight();int originalWidth = bufferedImage.getWidth();// 设定等比例压缩。if ((originalHeight / (double) height) > (originalWidth / (double) width)) {pointedHeight = NumberUtils.min(height, originalHeight);pointedWidth = -1;} else {pointedHeight = -1;pointedWidth = NumberUtils.min(width, originalWidth);}// 压缩图片,此处附上颜色类型BufferedImage.TYPE_INT_RGB。Color.WHITE,可以有效避免png转jpg时图片发红的问题。Image newImage = bufferedImage.getScaledInstance(pointedWidth, pointedHeight, Image.SCALE_SMOOTH);BufferedImage newBufferedImage = new BufferedImage(newImage.getWidth(null), newImage.getHeight(null),BufferedImage.TYPE_INT_RGB);     newBufferedImage.getGraphics().drawImage(newImage, 0, 0,Color.WHITE, null);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(newBufferedImage, type, byteArrayOutputStream);byteArrayOutputStream.close();data = byteArrayOutputStream.toByteArray();if (maxSize != null && data.length > maxSize) {// 设定递归的保险,以免图片质量太差if (maxSize < 5000 && (data.length > 10 * maxSize)) {maxSize = 5000;}// 递归压缩double scale = Math.max(Math.pow(maxSize / (double) data.length, 0.5), 0.9);return zipImageToScaledSize(data, (int) (width * scale), (int) (height * scale), type, maxSize);} else {return data;}
}

附上测试用例。

 @Testpublic void getformatname() throws Exception {//文件夹遍历图片,文件夹地址自定。File fileFolder=new File("D:/downloads/testImage");File[] fileList=fileFolder.listFiles();for(File file:fileList){InputStream input = new FileInputStream(file);byte[] data = new byte[(input.available())];input.read(data);input.close();String type="bmp";data = zipImageToScaledSize(data,600, 800, type,100000);OutputStream output = new FileOutputStream("D:/downloads/testResult/"+Math.random()+"."+type);output.write(data);output.close();}}

JAVA进行图片压缩相关推荐

  1. Java将图片压缩为原来的一半

    Java将图片压缩为原来的一半 思路: 1.获取源图片的尺寸 2.设置目标图片的尺寸 3.打开源图片 4.基于源图片生成目标图片 ps: 在linux上无法使用JPEGImageEncoder ,因此 ...

  2. 纯Java代码 图片压缩

    Java图片压缩代码 package com.img; import java.awt.Image; import java.awt.image.BufferedImage; import java. ...

  3. Java将图片压缩100KB以下,压缩图片,将几MB的图片压缩成100KB

    前言 随着手机像素越来越大图片占用内存就越大,用户上传多几张图片都占用了很多存储内存,所以我们需要将图片压缩为占用内存较小的图片 实现 复制这个类过去就可以使用,根据自己需求修改即可 package ...

  4. 写给大忙人看的 - Java中图片压缩上传至MinIO服务器(4)

    之前文章已经介绍了 MinIO 的环境搭建,已经对文件的上传下载方法,本篇文章一起与大家来学习图片压缩上传的方法 1.背景 最近客户总抱怨 APP 中图片显示较慢, 升级服务器带宽又没有多的预算.查看 ...

  5. java 解决图片压缩背景色变黑的问题

    项目场景: 之前公司有个需求是将用户上传的图片自动压缩,作为一个菜鸟,要想苟活于公司之下,大多时候都是面向百度开发,熟练地运用 CV 大法,不求成为公司的大佬,只想安安心心的过好每一天. 翻阅了很多博 ...

  6. Java实现图片压缩且不改变原图尺寸

    最近工作中涉及图片压缩相关的操作,需求如下: 大于2MB的图片需要压缩到2MB以下,且不改变原图的尺寸 引入依赖: <dependency><groupId>net.coobi ...

  7. Java将图片压缩质量后返回一个byte数组

    项目为了降低存储生成,需要将图片质量压缩大小不变,并且全程要在内存中进行,所以我写了下面的方法.方法中传入参数有两个一个是图片的byte数组,一个是压缩质量(压缩质量在0-1之间).处理完毕后会返回一 ...

  8. Java实现图片压缩代码,图片大小转换

    在很多项目中我们会把上传的图片做处理,比较图片上传过多对服务器的容量和带宽有很多的浪费,如果不是必须的高清图片,我们可以通过代码来做压缩.在我的项目中我们压缩图片的目的是让web页面打开的速度很快,并 ...

  9. Java 实现图片压缩、裁剪

    1.引入依赖 <!--hutool 工具--> <dependency><groupId>cn.hutool</groupId><artifact ...

最新文章

  1. C++ 函数参数 值传递与引用传递
  2. linux sysconf函数,linux c sysconf函数 得到系统配置
  3. 找DB2存储过程的package
  4. Java工程师必备技能
  5. GitLab创建项目 命令上传代码
  6. C++ 11 深度学习(十)多线程
  7. python json解析_python读取json文件并解析
  8. 提高篇 第五部分 动态规划 第1章 区间类动态规划
  9. c# mysql 连接串_c# – 如何形成一个正确的MySQL连接字符串?
  10. IDEA破解(破解补丁)
  11. orm jpa_Spring ORM示例– JPA,Hibernate,事务
  12. 图解设计模式(二)适配器模式
  13. 开根号的笔算算法图解_用笔算开根号
  14. 将长表格图片转Excel表格
  15. 多媒体视频开发_(3) ffmpeg获取视频的总帧数
  16. POJ 1392 Ouroboros Snake (欧拉回路)
  17. c语言京东购物系统,仿京东商城: 自主使用微信小程序实现的网上商城案例(包括前端和后台),利用了微信小程序的云数据库...
  18. 我的RUST学习——【第九章 9-1】panic! 与不可恢复的错误
  19. pytorch——卷积神经网络
  20. 算法复杂度/大O方法/渐近分析法

热门文章

  1. 谷粒商城三阶段课件_北京版初中化学九年级上册第三节 氧气的性质公开课优质课课件教案视频...
  2. (三十)AO和GO剖析
  3. DOTA2人机决战:2:0!OpenAI击败世界冠军OG
  4. 3. PyCharm、PyQt5、PyQt5-tools的下载安装、基于PyCharm开发PyQt5
  5. DICOM图像全方位解读
  6. android碎片实验报告,三年级下册科学实验报告模板1篇
  7. android强制全屏_如何强制任何Android应用进入全屏浸入模式(无生根)
  8. Excel根据身份证号批量提取出生日期
  9. 微信小程序 发布后强制更新版本 强制覆盖老版本
  10. Axure如何实现全选、全不选功能