当前位置: 首页 > 编程笔记 >

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

蒯宏达
2023-03-14
本文向大家介绍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 图片压缩的资料请关注小牛知识库其它相关文章!

 类似资料:
  • 本文向大家介绍PHP实现图片压缩的两则实例,包括了PHP实现图片压缩的两则实例的使用技巧和注意事项,需要的朋友参考一下 本文介绍了PHP实现图片压缩的两种方法,读者可以根据具体应用参考或加以改进,以适应自身应用需求!废话不多说,主要代码部分如下: 实例1: 实例2:

  • 本文向大家介绍JNI方法实现图片压缩(压缩率极高),包括了JNI方法实现图片压缩(压缩率极高)的使用技巧和注意事项,需要的朋友参考一下 前言 直接使用项目或直接复制libs中的so库到项目中即可(当前只构建了armeabi),需要其他ABI可检下项目另外使用CMake构建即可。 结果预览: 效果图.png   jni_278KB.png quality_484KB.png sample_199KB

  • 本文向大家介绍php上传图片并压缩的实现方法,包括了php上传图片并压缩的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲解了php上传图片并压缩的实现方法,之前一篇《PHP实现图片上传并压缩》已经为大家进行了简单介绍,此次实现上传图片然后按照比例缩略图,指定缩略图的最大高度或者最大宽度,具体内容如下 实现代码: 使用方法: 希望本文所述对大家学习php程序设计有所帮助。

  • 本文向大家介绍详解Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片,包括了详解Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片的使用技巧和注意事项,需要的朋友参考一下 10万+IT人都在关注的图片批量压缩上传方案(完整案例+代码) 背景需求:为了客户端访问图片资源时,加载图片更流畅,体验更好,通常不会直接用原图路径,需要根据不同的场景显示不同规格的缩略图,根据商品关键属

  • 本文向大家介绍python如何实现图片压缩,包括了python如何实现图片压缩的使用技巧和注意事项,需要的朋友参考一下 本工具是通过将图片上传到第三方网站tinypng,进行压缩后下载,覆盖本地图片,tinypng是一个强大的图片处理网站,目前最可靠的无损压缩网站。 代码如下: 改进版 优化点: 1.遍历完成本地文件夹再去上传网站 2.所有图片压缩完成再去下载 3.启动多线程下载 4.设定时间为加

  • 本文向大家介绍c# 如何实现图片压缩,包括了c# 如何实现图片压缩的使用技巧和注意事项,需要的朋友参考一下 一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图。 一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的