欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 實(shí)現(xiàn)圖片壓縮的兩種方法

 更新時(shí)間:2020年09月11日 09:34:23   作者:Nemo  
這篇文章主要介紹了Java 實(shí)現(xiàn)圖片壓縮的兩種方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

問題背景。

典型的情景:Nemo社區(qū)中,用戶上傳的圖片免不了要在某處給用戶做展示。

如用戶上傳的頭像,那么其他用戶在瀏覽該用戶信息的時(shí)候,就會(huì)需要回顯頭像信息了。

用戶上傳的原圖可能由于清晰度較高而體積也相對(duì)較大,考慮用戶流量帶寬,一般而言我們都不會(huì)直接體積巨大的原圖直接丟給用戶讓用戶慢慢下載。

這時(shí)候通常我們會(huì)在服務(wù)器對(duì)圖片進(jìn)行壓縮,然后把壓縮后的圖片內(nèi)容回顯給用戶。

壓縮方案:

這里主要找了兩個(gè)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("");
		}
	}

重點(diǎn)在于:

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("");
	  }
	}

實(shí)際測試中,批量的情境下,后者較前者更快一些。

以上就是Java 實(shí)現(xiàn)圖片壓縮的兩種方法的詳細(xì)內(nèi)容,更多關(guān)于Java 圖片壓縮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring注解@Configuration與@Bean注冊(cè)組件的使用詳解

    Spring注解@Configuration與@Bean注冊(cè)組件的使用詳解

    這篇文章主要介紹了SpringBoot中的注解@Configuration與@Bean注冊(cè)組件的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2022-06-06
  • SpringBoot之RabbitMQ的使用方法

    SpringBoot之RabbitMQ的使用方法

    這篇文章主要介紹了SpringBoot之RabbitMQ的使用方法,詳細(xì)的介紹了2種模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java?中的?getDeclaredFields()使用與原理解析

    Java?中的?getDeclaredFields()使用與原理解析

    在Java反射機(jī)制中,getDeclaredFields()用于獲取類的所有字段,包括私有字段,通過反射,可以在運(yùn)行時(shí)動(dòng)態(tài)地獲取類的信息并操作其成員,本文詳細(xì)介紹了getDeclaredFields()的使用方法、工作原理以及最佳實(shí)踐,涵蓋了反射的基本概念、使用場景和注意事項(xiàng),感興趣的朋友一起看看吧
    2025-01-01
  • JAVA實(shí)現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼

    JAVA實(shí)現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼

    這篇文章主要介紹了JAVA實(shí)現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼,需要的朋友可以參考下
    2017-06-06
  • 使用Jackson反序列化遇到的問題及解決

    使用Jackson反序列化遇到的問題及解決

    這篇文章主要介紹了使用Jackson反序列化遇到的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 深入解析Java的設(shè)計(jì)模式編程中單例模式的使用

    深入解析Java的設(shè)計(jì)模式編程中單例模式的使用

    這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中單例模式的使用,一般來說將單例模式分為餓漢式單例和懶漢式單例,需要的朋友可以參考下
    2016-02-02
  • 零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java

    零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java

    這篇文章主要介紹了零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java,很多朋友糾結(jié)這個(gè)問題,教材書不知道從何學(xué)起,今天小編給大家分享一篇教程幫助到家梳理這方面的知識(shí)
    2020-07-07
  • Java8方法引用及構(gòu)造方法引用原理實(shí)例解析

    Java8方法引用及構(gòu)造方法引用原理實(shí)例解析

    這篇文章主要介紹了Java8方法引用及構(gòu)造方法引用原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 學(xué)生視角看Java 面向?qū)ο蟮睦^承本質(zhì)

    學(xué)生視角看Java 面向?qū)ο蟮睦^承本質(zhì)

    繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類。繼承就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為
    2022-03-03
  • JDBC連接SQL?Server數(shù)據(jù)庫實(shí)現(xiàn)增刪改查的全過程

    JDBC連接SQL?Server數(shù)據(jù)庫實(shí)現(xiàn)增刪改查的全過程

    實(shí)際開發(fā)中手動(dòng)的輸入SQL語句是少之又少,大多數(shù)情況下是通過編譯代碼進(jìn)行來控制自動(dòng)執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于JDBC連接SQL?Server數(shù)據(jù)庫實(shí)現(xiàn)增刪改查的相關(guān)資料,需要的朋友可以參考下
    2023-04-04

最新評(píng)論