Java 实现图片压缩的两种方法

 更新时间:2020年09月11日 09:34:23   作者:Nemo  
这篇文章主要介绍了Java 实现图片压缩的两种方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下

问题背景。

典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示。

如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了。

用户上传的原图可能由于清晰度较高而体积也相对较大,考虑用户流量带宽,一般而言我们都不会直接体积巨大的原图直接丢给用户让用户慢慢下载。

这时候通常我们会在服务器对图片进行压缩,然后把压缩后的图片内容回显给用户。

压缩方案:

这里主要找了两个java中常用的图片压缩工具库:Graphics和Thumbnailator。

1、Graphics:

    /**
	 * compressImage
	 * 
	 * @param imageByte
	 *      Image source array
	 * @param ppi
	 * @return
	 */
	public static byte[] compressImage(byte[] imageByte, int ppi) {
		byte[] smallImage = null;
		int width = 0, height = 0;
 
		if (imageByte == null)
			return null;
 
		ByteArrayInputStream byteInput = new ByteArrayInputStream(imageByte);
		try {
			Image image = ImageIO.read(byteInput);
			int w = image.getWidth(null);
			int h = image.getHeight(null);
			// adjust weight and height to avoid image distortion
			double scale = 0;
			scale = Math.min((float) ppi / w, (float) ppi / h);
			width = (int) (w * scale);
			width -= width % 4;
			height = (int) (h * scale);
 
			if (scale >= (double) 1)
				return imageByte;
 
			BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			ImageIO.write(buffImg, "png", out);
			smallImage = out.toByteArray();
			return smallImage;
 
		} catch (IOException e) {
			log.error(e.getMessage());
			throw new RSServerInternalException("");
		}
	}

重点在于:

BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

2、Thumbnailator:

    /**
	 * compressImage
	 * 
	 * @param path
	 * @param ppi
	 * @return
	 */
	public static byte[] compressImage(String path, int ppi) {
		byte[] smallImage = null;
 
	  try {
	    ByteArrayOutputStream out = new ByteArrayOutputStream();
		Thumbnails.of(path).size(ppi, ppi).outputFormat("png").toOutputStream(out);
		smallImage = out.toByteArray();
		return smallImage;
	  } catch (IOException e) {
		log.error(e.getMessage());
		throw new RSServerInternalException("");
	  }
	}

实际测试中,批量的情境下,后者较前者更快一些。

以上就是Java 实现图片压缩的两种方法的详细内容,更多关于Java 图片压缩的资料请关注脚本之家其它相关文章!

相关文章

  • 详解IDEA中Debug的使用和进制转换问题

    详解IDEA中Debug的使用和进制转换问题

    这篇文章主要介绍了IDEA中Debug的使用和进制转换,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • mybatis plus条件构造器queryWrapper、updateWrapper

    mybatis plus条件构造器queryWrapper、updateWrapper

    这篇文章主要介绍了mybatis plus条件构造器queryWrapper、updateWrapper,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • springboot项目使用nohup将日志指定输出文件过大问题及解决办法

    springboot项目使用nohup将日志指定输出文件过大问题及解决办法

    在Spring Boot项目中,使用nohup命令重定向日志输出到文件可能会使日志文件过大,文章介绍了两种解决方法:一是创建脚本直接清除日志文件,二是创建脚本保留部分日志内容,并将这些脚本加入定时任务中,这可以有效控制日志文件的大小,避免占用过多磁盘空间
    2024-10-10
  • jdk11 jdk17多版本共存切换方式

    jdk11 jdk17多版本共存切换方式

    这篇文章主要介绍了jdk11 jdk17多版本共存切换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • java中JSONArray互相转换List的实现

    java中JSONArray互相转换List的实现

    本文主要介绍了java中JSONArray互相转换List的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何使用RequestHeaders添加自定义参数

    如何使用RequestHeaders添加自定义参数

    这篇文章主要介绍了使用RequestHeaders添加自定义参数方式,具有很好的参考价值,希望对大家有所帮助。
    2022-02-02
  • 浅谈Java变量的初始化顺序详解

    浅谈Java变量的初始化顺序详解

    本篇文章是对Java变量的初始化顺序进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • java实现简单的学生信息管理系统代码实例

    java实现简单的学生信息管理系统代码实例

    这篇文章主要介绍了java实现简单的学生信息管理系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java中@Async异步失效的9种场景

    Java中@Async异步失效的9种场景

    最近在项目某个方法使用@Async注解,但是该方法还是同步执行了,异步不起作用,到底是什么原因呢?接下来本文给大家介绍了Java @Async异步失效的9种场景,需要的朋友可以参考下
    2024-05-05
  • Java实现同步枚举类数据到数据库

    Java实现同步枚举类数据到数据库

    这篇文章主要为大家详细介绍了Java实现同步枚举类数据到数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论