Java實(shí)現(xiàn)把圖片處理到指定大小的操作方法
引言
項(xiàng)目開發(fā)中,經(jīng)常遇到圖片上傳功能,發(fā)現(xiàn)如果圖片比較大時(shí),在查看、預(yù)覽、下載速度會(huì)特別慢,考慮到浪費(fèi)流量以及文件服務(wù)器的存儲(chǔ)空間,決定在后端優(yōu)化處理完再上傳,以減少存儲(chǔ)空間與優(yōu)化傳輸速率。這里使用Java自帶的ImageIO進(jìn)行處理分享給大家。
1、Java常見的圖像處理插件
- Java自帶的
ImageIO
- Google的Thumbnails(實(shí)現(xiàn)也相對(duì)于比較簡(jiǎn)單,功能也更加豐富)-- 可自行了解
本文將使用兩種工具實(shí)現(xiàn)圖片的壓縮,在保持清晰度的前提下,去減少圖片的大小,以達(dá)到減少存儲(chǔ)空間與提高文件傳輸速率的目的。
2、圖片壓縮優(yōu)化實(shí)戰(zhàn)
以壓縮JPG文件為例,詳見下圖現(xiàn)有接近40MB的jpg文件。
Google的Thumbnails
1.先引入依賴
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.20</version> </dependency>
代碼實(shí)現(xiàn)
@Test public void test4() { String filePath = "/static/dist.jpg"; // 文件路徑 ClassPathResource resource = new ClassPathResource(filePath); InputStream inputStream = null; try { inputStream = resource.getInputStream(); int i = 0; for (float quality = 0.9f; quality > 0.0f; quality -= 0.1f) { String path = StrUtil.format("src/main/resources/static/compression_dist_{}.jpg", ++i); File distFile = new File(path); Thumbnails.of(inputStream) .scale(quality) .outputQuality(1) // 輸出的圖片質(zhì)量 .toFile(distFile); long length = distFile.length(); if (length / 1024 <= 5120) { // 壓縮至5MB左右 System.out.println(length / (1024 * 1024) + "MB"); break; } if (ObjectUtil.isNull(inputStream) || inputStream.available() == 0) { inputStream = new FileInputStream(distFile); } distFile.delete(); } } catch (IOException ex) { log.error(ex.getMessage()); ex.printStackTrace(); } finally { IoUtil.close(inputStream); } }
Java自帶的ImageIO
@Test public void test() { // 1.準(zhǔn)備jpg圖像編寫器 Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); ImageWriter writer = writers.next(); ImageWriteParam writeParam = writer.getDefaultWriteParam(); writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 設(shè)置壓縮模式 // 2.準(zhǔn)備源文件(要壓縮的文件) String filePath = "/static/dist.jpg"; // 文件路徑 ClassPathResource resource = new ClassPathResource(filePath); // 3.指定目標(biāo)壓縮文件大?。ㄟ@里按KB計(jì)算) int targetSize = 5120; // 5MB try (InputStream inputStream = resource.getInputStream()) { int available = inputStream.available(); // 4.判斷源文件大小是否小于目標(biāo)壓縮大小 if ((available / 1000) <= targetSize) { log.error(StrUtil.format("[{}] 文件小于 {}KB 無需壓縮!", resource.getFilename(), targetSize)); return; } BufferedImage inputImage = ImageIO.read(inputStream); // 設(shè)定壓縮比例(接近目標(biāo)文件大小) for (float quality = 0.95f; quality > 0.0f; quality -= 0.05f) { String path = StrUtil.format("src/main/resources/static/compression_dist_{}.jpg", quality); File distFile = new File(path); // 輸出參數(shù) ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(distFile); writer.setOutput(imageOutputStream); writeParam.setCompressionQuality(quality); // 設(shè)置壓縮比例(0-1之間) writer.write(null, new IIOImage(inputImage, null, null), writeParam); // 是否接近于目標(biāo)大小 if (distFile.length() / 1024 <= targetSize) { IoUtil.close(imageOutputStream); break; } distFile.delete(); } } catch (IOException ex) { log.error(ex.getMessage()); ex.printStackTrace(); } // IoUtil.close(imageOutputStream); writer.dispose(); }
再來看壓縮效果(dist.jpg為原文件),可以打開文件進(jìn)行對(duì)比(清晰度基本沒啥變化)
到此這篇關(guān)于Java實(shí)現(xiàn)把圖片處理到指定大小的操作方法的文章就介紹到這了,更多相關(guān)Java圖片指定大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基于dom4j包實(shí)現(xiàn)對(duì)XML解析的方法
這篇文章主要介紹了java基于dom4j包實(shí)現(xiàn)對(duì)XML解析的方法,結(jié)合實(shí)例形式分析了java針對(duì)xml格式數(shù)據(jù)的相關(guān)解析操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡(jiǎn)單封裝
這篇文章主要介紹了淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡(jiǎn)單封裝,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體實(shí)例解析
本文是小編給大家總結(jié)的關(guān)于Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體的內(nèi)容,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05springbean的加載過程及應(yīng)用場(chǎng)景分析
Bean已經(jīng)被實(shí)例化、屬性注入、初始化,并且注冊(cè)到容器中,可以被其他Bean或應(yīng)用程序使用,這篇文章主要介紹了springbean的加載過程以及應(yīng)用場(chǎng)景,需要的朋友可以參考下2024-04-04