Java 實(shí)現(xiàn)圖片壓縮的兩種方法
問題背景。
典型的情景: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è)組件的使用詳解
這篇文章主要介紹了SpringBoot中的注解@Configuration與@Bean注冊(cè)組件的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2022-06-06Java?中的?getDeclaredFields()使用與原理解析
在Java反射機(jī)制中,getDeclaredFields()用于獲取類的所有字段,包括私有字段,通過反射,可以在運(yùn)行時(shí)動(dòng)態(tài)地獲取類的信息并操作其成員,本文詳細(xì)介紹了getDeclaredFields()的使用方法、工作原理以及最佳實(shí)踐,涵蓋了反射的基本概念、使用場景和注意事項(xiàng),感興趣的朋友一起看看吧2025-01-01JAVA實(shí)現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼,需要的朋友可以參考下2017-06-06深入解析Java的設(shè)計(jì)模式編程中單例模式的使用
這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中單例模式的使用,一般來說將單例模式分為餓漢式單例和懶漢式單例,需要的朋友可以參考下2016-02-02零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java
這篇文章主要介紹了零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java,很多朋友糾結(jié)這個(gè)問題,教材書不知道從何學(xué)起,今天小編給大家分享一篇教程幫助到家梳理這方面的知識(shí)2020-07-07Java8方法引用及構(gòu)造方法引用原理實(shí)例解析
這篇文章主要介紹了Java8方法引用及構(gòu)造方法引用原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09學(xué)生視角看Java 面向?qū)ο蟮睦^承本質(zhì)
繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類。繼承就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為2022-03-03JDBC連接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