压缩图片工具类,压缩100KB以内拿走直接用
最近遇到自拍上传图片过大问题,很烦恼,所以自己写了一个压缩图片的工具类使用,自测效果很不错,可以压缩到KB以内,像素还可以分辨清晰
下面Java代码奉上:
- import lombok.extern.slf4j.Slf4j;
- import org.w3c.dom.Element;
- import javax.imageio.IIOImage;
- import javax.imageio.ImageIO;
- import javax.imageio.ImageTypeSpecifier;
- import javax.imageio.ImageWriter;
- import javax.imageio.metadata.IIOMetadata;
- import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
- import javax.imageio.stream.ImageOutputStream;
- import java.awt.*;
- import java.awt.image.BufferedImage;
- import java.io.*;
- import java.net.HttpURLConnection;
- import java.net.URL;
- /**
- * @Author: Mr. Chang
- */
- @Slf4j
- public class ImageZipUtils {
- /**
- * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩
- *
- * @param imgsrc 源图片地址
- * @param imgdist 目标图片地址
- * @param widthdist 压缩后图片宽度(当rate==null时,必传)
- * @param heightdist 压缩后图片高度(当rate==null时,必传)
- * @param rate 压缩比例
- */
- public static void reduceImg(String imgsrc, String imgdist, int widthdist,
- int heightdist, Float rate) {
- try {
- File srcfile = new File(imgsrc);
- // 检查文件是否存在
- if (!srcfile.exists()) {
- return;
- }
- // 如果rate不为空说明是按比例压缩
- if (rate != null && rate > 0) {
- // 获取文件高度和宽度
- int[] results = getImgWidth(srcfile);
- if (results == null || results[0] == 0 || results[1] == 0) {
- return;
- } else {
- widthdist = (int) (results[0] * rate);
- heightdist = (int) (results[1] * rate);
- }
- }
- // 开始读取文件并进行压缩
- Image src = javax.imageio.ImageIO.read(srcfile);
- BufferedImage tag = new BufferedImage((int) widthdist,
- (int) heightdist, BufferedImage.TYPE_INT_RGB);
- tag.getGraphics().drawImage(
- src.getScaledInstance(widthdist, heightdist,
- Image.SCALE_SMOOTH), 0, 0, null);
- FileOutputStream out = new FileOutputStream(imgdist);
- // JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
- // encoder.encode(tag);
- // out.close();
- float per = (float) 0.85;
- saveAsJPEG(100, tag, per, out);
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- }
- /**
- * 以JPEG编码保存图片
- *
- * @param dpi 分辨率
- * @param image_to_save 要处理的图像图片
- * @param JPEGcompression 压缩比
- * @param fos 文件输出流
- * @throws IOException
- */
- public static void saveAsJPEG(Integer dpi, BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException {
- // Image writer
- ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpg").next();
- ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
- imageWriter.setOutput(ios);
- //and metadata
- IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);
- if (dpi != null && !dpi.equals("")) {
- //new metadata
- Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
- Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
- jfif.setAttribute("Xdensity", Integer.toString(dpi));
- jfif.setAttribute("Ydensity", Integer.toString(dpi));
- }
- if (JPEGcompression >= 0 && JPEGcompression <= 1f) {
- // new Compression
- JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
- jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
- jpegParams.setCompressionQuality(JPEGcompression);
- }
- //new Write and clean up
- imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null);
- ios.close();
- imageWriter.dispose();
- }
- /**
- * 获取图片宽度
- *
- * @param file 图片文件
- * @return 宽度
- */
- public static int[] getImgWidth(File file) {
- InputStream is = null;
- BufferedImage src = null;
- int result[] = {0, 0};
- try {
- is = new FileInputStream(file);
- src = javax.imageio.ImageIO.read(is);
- result[0] = src.getWidth(null); // 得到源图宽
- result[1] = src.getHeight(null); // 得到源图高
- is.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return result;
- }
- public static byte[] readInputStream(InputStream inStream) throws Exception {
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- //创建一个Buffer字符串
- byte[] buffer = new byte[1024];
- //每次读取的字符串长度,如果为-1,代表全部读取完毕
- int len = 0;
- //使用一个输入流从buffer里把数据读取出来
- while ((len = inStream.read(buffer)) != -1) {
- //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
- outStream.write(buffer, 0, len);
- }
- //关闭输入流
- inStream.close();
- //把outStream里的数据写入内存
- return outStream.toByteArray();
- }
- /**
- * 保存自拍照片
- * @param userId
- * @param photo_url
- * @param suffixFromUrl
- * @param path
- * @throws Exception
- */
- public static void saveZipImage(Integer userId, String photo_url, String suffixFromUrl, String path) throws Exception {
- //new一个URL对象
- URL url = new URL(photo_url);
- //打开链接
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- //设置请求方式为"GET"
- conn.setRequestMethod("GET");
- //超时响应时间为5秒
- conn.setConnectTimeout(5 * 1000);
- //通过输入流获取图片数据
- InputStream inStream = conn.getInputStream();
- //得到图片的二进制数据,以二进制封装得到数据,具有通用性
- byte[] data = readInputStream(inStream);
- //new一个文件对象用来保存图片,默认保存当前工程根目录
- File imageFile = new File(path + userId + suffixFromUrl);
- //创建输出流
- FileOutputStream outStream = new FileOutputStream(imageFile);
- //写入数据
- outStream.write(data);
- //关闭输出流
- outStream.close();
- }
- /**
- * 开始压缩图片
- * @param userId
- * @param suffix
- * @param path
- * @return
- */
- public static String imageZipStart(Integer userId, String suffix, String path) {
- /**
- * d://3.jpg 源图片
- * d://31.jpg 目标图片
- * 压缩宽度和高度都是1000
- *
- */
- String original = path + userId + suffix;
- String target = path + userId + "target" + suffix;
- File srcfile = new File(original);
- log.info(userId + "用户自拍照压缩前自拍照大小:" + srcfile.length());
- reduceImg(original, target, 888, 888, null);
- File distfile = new File(target);
- log.info("用户自拍照压缩后自拍照大小:" + distfile.length());
- return target;
- }
- /**
- * 删除文件
- */
- public static void delFile(String fileName) {
- File deFile = new File(fileName);
- if (deFile.exists()) {
- deFile.delete();
- }
- }
- }
如有更正,欢迎下方评论联系我,谢谢
压缩图片工具类,压缩100KB以内拿走直接用的更多相关文章
- Java图片工具类,完成图片的截取和任意缩放
package com.common.util; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Renderin ...
- 拍照、本地图片工具类(兼容至Android7.0)
拍照.本地图片工具类:解决了4.4以上剪裁会提示"找不到文件"和6.0动态授予权限,及7.0报FileUriExposedException异常问题. package com.hb ...
- Android--很实用的图片工具类
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; imp ...
- Android 调节图片工具类
package com.base.changeimage; import android.graphics.Bitmap; import android.graphics.Canvas; import ...
- 图片压缩java工具类
package com.net.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.Fil ...
- Java操作zip压缩和解压缩文件工具类
需要用到ant.jar(这里使用的是ant-1.6.5.jar) import java.io.File; import java.io.FileInputStream; import java.io ...
- PHP图片压缩类,高清无损直接用就ok啦
这个不完全是我自己写的-_-!,但是好用呀 <?php /** * Created by PhpStorm. * Note:文件介绍 * User: Lynly * Date: 2018/11/ ...
- java中自己常用到的工具类-压缩解压zip文件
package com.ricoh.rapp.ezcx.admintoolweb.util; import java.io.File; import java.io.FileInputStream; ...
- Android list加载图片工具类
总体思路 Handler + looper + message 核心类 package com.base.imagechoose.util; import android.graphics.Bitma ...
随机推荐
- CentOS7 安装 Python3.6.5
在centos7下安装python3.6.5 CentOS7编译安装python3.6.8报错zipimport.ZipImportError: can't decompress data; zlib ...
- 神经网络训练技巧:训练参数初始化、Drop out及Batch Normalization
参数初始化: xavier初始化: https://blog.csdn.net/VictoriaW/article/details/73000632 条件:优秀的初始化应该使得各层的激活值和梯度的方差 ...
- 安装后jdk1.8 配置环境变量以后 版本显示还是1.7
配置图如下 1.7版本不用卸载 不用就可以了
- Python 基本数据类型详解
1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647在64位系统上,整数的位数为64位,取值范围为-2* ...
- VS2015开发常用快捷键
以下内容均Ctrl+后面的按钮 M-O\P折叠 K-F 格式化 K-U\C注释 K-S侧外代码-(区域代码) 代码片段 ctor 自动生成默认的构造函数 prop 自动生成get set方法 cw 自 ...
- Ldap 从入门到放弃(一)
OpenLDAP 2.4版本 快速入门 本文内容是自己通过官网文档.网络和相关书籍学习和理解并整理成文档,其中有错误或者疑问请在文章下方留言. 一.Introduction to OpenLDAP D ...
- LeetCode--062--不同路径(python)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问总共有多 ...
- 02-webpack的作用
webpack的作用,将不同静态资源的类型打包成一个JS文件,在html页面应用该JS文件的时候,JS文件里的html就可以正常的运行,去执行操作. 也可以加载前端页面的CSS样式.Img图片
- Socket网络通信编程(一)
1.学习基本概念.传统的同步阻塞式I/O编程.伪异步IO实现 2.学习基于NIO的同步非阻塞式编程 3.了解基于NIO2.0的异步非阻塞(AIO)编程 1.1 基本概念 Socket又称“套接字”,应 ...
- 3D Computer Grapihcs Using OpenGL - 12 Rotation Matrix
为了证明我们上节渲染出来的是一个立方体而不是一个平面,我们决定将它旋转一定角度,这样我们就需要一个旋转矩阵(也属于ModelTransformMatrix的一部分) 上一节我们的ModelTransf ...