java图片压缩工具类
1:先导入依赖 net.coobird thumbnailator 0.4.8
2:创建工具类import net.coobird.thumbnailator.Thumbnails; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; /** * @PROJECT_NAME: water_chivalry * @AUTHOR: Hanson-Hsc * @DATE: 2020-07-27 09:08 * @DESCRIPTION: 图片压缩工具 * @VERSION: */ public class PicUtils { //以下是常量,按照阿里代码开发规范,不允许代码中出现魔法值 private static final Logger logger = LoggerFactory.getLogger(PicUtils.class); private static final Integer ZERO = 0; private static final Integer ONE_ZERO_TWO_FOUR = 1024; private static final Integer NINE_ZERO_ZERO = 900; private static final Integer THREE_TWO_SEVEN_FIVE = 3275; private static final Integer TWO_ZERO_FOUR_SEVEN = 2047; private static final Double ZERO_EIGHT_FIVE = 0.85; private static final Double ZERO_SIX = 0.6; private static final Double ZERO_FOUR_FOUR = 0.44; private static final Double ZERO_FOUR = 0.4; /** * 根据指定大小压缩图片 * * @param imageBytes 源图片字节数组 * @param desFileSize 指定图片大小,单位kb * @return 压缩质量后的图片字节数组 */ public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) { if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) { return imageBytes; } long srcSize = imageBytes.length; double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR); try { while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) { ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length); Thumbnails.of(inputStream) .scale(accuracy) .outputQuality(accuracy) .toOutputStream(outputStream); imageBytes = outputStream.toByteArray(); } logger.info("图片原大小={}kb | 压缩后大小={}kb", srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR); } catch (Exception e) { logger.error("【图片压缩】msg=图片压缩失败!", e); } return imageBytes; } /** * 自动调节精度(经验数值) * * @param size 源图片大小 * @return 图片压缩质量比 */ private static double getAccuracy(long size) { double accuracy; if (size < NINE_ZERO_ZERO) { accuracy = ZERO_EIGHT_FIVE; } else if (size < TWO_ZERO_FOUR_SEVEN) { accuracy = ZERO_SIX; } else if (size < THREE_TWO_SEVEN_FIVE) { accuracy = ZERO_FOUR_FOUR; } else { accuracy = ZERO_FOUR; } return accuracy; } }
3:在上传图片接口处进行压缩
/*** 图片上传(招租广告图片专用入口)*/ @PostMapping("file/img") @ApiOperation(value = "图片上传接口(广告图片专用入口)") public ResultVo imgUploads(@RequestParam("file") MultipartFile file) throws IOException { //压缩图片到指定120K以内,不管你的图片有多少兆,都不会超过120kb,精度还算可以,不会模糊 byte[] bytes = PicUtils.compressPicForScale(file.getBytes(), 120); ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);//生成保存在服务器的图片名称,统一修改原后缀名为:jpg String newFileName = UUID.randomUUID() + ".jpg"; OSSUtil.upload2(newFileName, inputStream); JSONObject result = new JSONObject(); result.put("url", OSSUtil.getUrl2(newFileName, "")); return ResultVoUtil.success(result); }
4.还有一个压缩图片工具类,但是不能指定压缩大小,可是很有用,压缩不会丢失精度,图片也很清晰:
import com.bamboo.water_chivalry.common.enums.ResultEnum; import com.bamboo.water_chivalry.common.exception.GlobalException; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; /** @DESCRIPTION: 图片压缩工具 @VERSION:*/ public class ImgCompression { public static InputStream getImageCom(MultipartFile file) throws IOException { //获取文件输入流 InputStream inputStream = file.getInputStream(); try { // 把图片读入到内存中 BufferedImage bufImg = ImageIO.read(inputStream); // 压缩代码,存储图片文件byte数组 ByteArrayOutputStream bos = new ByteArrayOutputStream(); //防止图片变红,这一步非常重要 BufferedImage bufferedImage = new BufferedImage(bufImg.getWidth(), bufImg.getHeight(), BufferedImage.TYPE_INT_RGB); bufferedImage.createGraphics().drawImage(bufImg,0,0, Color.WHITE,null); //先转成jpg格式来压缩,然后在通过OSS来修改成源文件本来的后缀格式 ImageIO.write(bufferedImage,"jpg",bos); //获取输出流 inputStream = new ByteArrayInputStream(bos.toByteArray()); return inputStream; } catch (IOException e) { e.printStackTrace(); throw new GlobalException(ResultEnum.IMG_UPLOAD_ERROR); }finally { inputStream.close(); } } }
Linux基础知识Linux基本认知容量大小bit(位)Byte(字节,8位)KB(210,千字节)MB(兆字节)GB(吉字节)TBGbit(吉比特)自动补全命令或文件(夹)TAB复用之前的命令上下
苹果硬件不如国产机?这是国产机编织的谎言,是对苹果的误解最近这几年,估计很多人都听过苹果硬件落后,不如国产机等这样的说法。甚至华为余承东曾经直接这样他们在硬件方面已经难与我们竞争,苹果目前缺乏产品硬件创新。而事实上,许多人也喜欢拿苹果的
PC市场迎来新变化荣耀正成为行业新星据第三方权威调研机构报告显示,截至2021年11月份,在中国轻薄本市场,联想华硕戴尔惠普等传统PC厂商市场份额出现较大波动以荣耀华为为首的新兴品牌,其市场份额合计超过20,正在不断
哥伦比亚大学教授大公司的法律套利圣诞购物季来临时,不管你是否拥有相关信仰,在每年这个时候几乎都无法抗拒购物和送礼的诱惑。不过最大的送礼者其实是非生命体我指的可不是人工智能,而是以常规企业形式存在的法人。各企业发放
全链条的未来教育变革随着网络技术人工智能等信息技术的迅速发展,人类社会正在发生巨大变化。生活方式变了,社会需求变了,知识传播渠道变了,我们的教育如何发展,这是教育人必须认真面对深入思考的问题。变革是教
被人说成疯子的投资家,他要建立300年屹立不倒的企业帝国孙正义何许人也,他是软银集团的总裁。他收购了ARM,投资过雅虎,阿里巴巴,还涉足了电力行业,被人评为鲁莽的投资家。他有着建立300年企业帝国的梦想,人们会觉得他是疯子。那他到底是个
因为科技导致的内卷和躺平虎年有娱正文我直接说核心观点吧,不然没人愿意看。科技上不去,我们就会在原有的阶级疯狂竞争,这就是我们说的内卷,等一定的阶级固化,我们发现无论如何竞争也很难,进行阶级跨越,大部分能力
小米12发布这么久了体验参数究竟怎样基本参数发布会时间2021年12月28日。上市日期2021年12月31日。机身材质黑色蓝色紫色金属中框,玻璃后壳原野绿金属中框,素皮后壳机身颜色紫色蓝色黑色原野绿指纹识别屏幕指纹识
新年好物选什么?首选华为智选720全效空气净化器2春节将至,各大厂商开始纷纷推出新年好物,为新年的年货做好充足的准备。这一次华为智选也没有落下,在华为智选720全效空气净化器的基础上全面升级的华为智选720全效空气净化器2也赶在新
iPhone15或全面采用自研基带,真的能够解决苹果的信号问题吗?尽管说,iPhone代表了手机行业非常高的水准,但是每一个iPhone用户都有一个苦衷,那就是iPhone的信号问题。在火车上电梯里,往往身边朋友的安卓手机都好好的,而自己的iPh
为什么有的手机要砍掉8128GB版本?内行人说出其中缘由观察今年手机行业的朋友应该发现了,有部分手机取消了128GB版本,起步就是256GB,促使手机厂商做出这一决定的原因是什么?难道128GB版本已经不够用了吗?还是大部分用户已经抛弃