java图片压缩(Thumbnails)
2018-12-14 08:36:59来源:博客园 阅读 ()
package com.hzxc.groupactivity.server.util; import java.awt.image.BufferedImage; import java.io.*; import java.math.BigDecimal; import javax.imageio.ImageIO; import net.coobird.thumbnailator.Thumbnails; import org.apache.commons.lang3.StringUtils; /** * Created by hdwang on 2018/12/13. */ public class PicUtils { public static void main(String[] args) { PicUtils.commpressPicForScale("/Users/hdwang/Downloads/1.jpg","/Users/hdwang/Downloads/1_s.jpg", 1000, 0.8,750,1334); // 图片小于1000kb } /** * 根据指定大小和指定精度压缩图片 * * @param srcPath * 源图片地址 * @param desPath * 目标图片地址 * @param desFileSize * 指定图片大小,单位kb * @param accuracy * 精度,递归压缩的比率,建议小于0.9 * @param desMaxWidth * 目标最大宽度 * @param desMaxHeight * 目标最大高度 * @return 目标文件路径 */ public static String commpressPicForScale(String srcPath, String desPath, long desFileSize, double accuracy,int desMaxWidth,int desMaxHeight) { if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(srcPath)) { return null; } if (!new File(srcPath).exists()) { return null; } try { File srcFile = new File(srcPath); long srcFileSize = srcFile.length(); System.out.println("源图片:" + srcPath + ",大小:" + srcFileSize / 1024 + "kb"); //获取图片信息 BufferedImage bim = ImageIO.read(srcFile); int srcWidth = bim.getWidth(); int srcHeight = bim.getHeight(); //先转换成jpg Thumbnails.Builder builder = Thumbnails.of(srcFile).outputFormat("jpg"); // 指定大小(宽或高超出会才会被缩放) if(srcWidth > desMaxWidth || srcHeight > desMaxHeight) { builder.size(desMaxWidth, desMaxHeight); }else{ //宽高均小,指定原大小 builder.size(srcWidth,srcHeight); } // 写入到内存 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存) builder.toOutputStream(baos); // 递归压缩,直到目标文件大小小于desFileSize byte[] bytes = commpressPicCycle(baos.toByteArray(), desFileSize, accuracy); // 输出到文件 File desFile = new File(desPath); FileOutputStream fos = new FileOutputStream(desFile); fos.write(bytes); System.out.println("目标图片:" + desPath + ",大小" + desFile.length() / 1024 + "kb"); System.out.println("图片压缩完成!"); } catch (Exception e) { e.printStackTrace(); return null; } return desPath; } private static byte[] commpressPicCycle(byte[] bytes, long desFileSize, double accuracy) throws IOException { // File srcFileJPG = new File(desPath); long srcFileSizeJPG = bytes.length; // 2、判断大小,如果小于500kb,不压缩;如果大于等于500kb,压缩 if (srcFileSizeJPG <= desFileSize * 1024) { return bytes; } // 计算宽高 BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes)); int srcWdith = bim.getWidth(); int srcHeigth = bim.getHeight(); int desWidth = new BigDecimal(srcWdith).multiply( new BigDecimal(accuracy)).intValue(); int desHeight = new BigDecimal(srcHeigth).multiply( new BigDecimal(accuracy)).intValue(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存) Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(accuracy).toOutputStream(baos); return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy); } }
参考文章:
https://blog.csdn.net/qiaqia609/article/details/53171149
https://blog.csdn.net/u010355502/article/details/77197616
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:数据库事务
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash