Java實現(xiàn)把圖片處理到指定大小的操作方法
引言
項目開發(fā)中,經(jīng)常遇到圖片上傳功能,發(fā)現(xiàn)如果圖片比較大時,在查看、預覽、下載速度會特別慢,考慮到浪費流量以及文件服務器的存儲空間,決定在后端優(yōu)化處理完再上傳,以減少存儲空間與優(yōu)化傳輸速率。這里使用Java自帶的ImageIO進行處理分享給大家。
1、Java常見的圖像處理插件
- Java自帶的
ImageIO - Google的Thumbnails(實現(xiàn)也相對于比較簡單,功能也更加豐富)-- 可自行了解
本文將使用兩種工具實現(xiàn)圖片的壓縮,在保持清晰度的前提下,去減少圖片的大小,以達到減少存儲空間與提高文件傳輸速率的目的。
2、圖片壓縮優(yōu)化實戰(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>
代碼實現(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.準備jpg圖像編寫器
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 設(shè)置壓縮模式
// 2.準備源文件(要壓縮的文件)
String filePath = "/static/dist.jpg"; // 文件路徑
ClassPathResource resource = new ClassPathResource(filePath);
// 3.指定目標壓縮文件大?。ㄟ@里按KB計算)
int targetSize = 5120; // 5MB
try (InputStream inputStream = resource.getInputStream()) {
int available = inputStream.available();
// 4.判斷源文件大小是否小于目標壓縮大小
if ((available / 1000) <= targetSize) {
log.error(StrUtil.format("[{}] 文件小于 {}KB 無需壓縮!", resource.getFilename(), targetSize));
return;
}
BufferedImage inputImage = ImageIO.read(inputStream);
// 設(shè)定壓縮比例(接近目標文件大小)
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);
// 是否接近于目標大小
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為原文件),可以打開文件進行對比(清晰度基本沒啥變化)

到此這篇關(guān)于Java實現(xiàn)把圖片處理到指定大小的操作方法的文章就介紹到這了,更多相關(guān)Java圖片指定大小內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Feign遠程調(diào)用傳遞對象參數(shù)并返回自定義分頁數(shù)據(jù)的過程解析
這篇文章主要介紹了Feign遠程調(diào)用傳遞對象參數(shù)并返回自定義分頁數(shù)據(jù)的過程解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
詳細聊聊Spring MVC重定向與轉(zhuǎn)發(fā)
大家應該都知道請求重定向和請求轉(zhuǎn)發(fā)都是web開發(fā)中資源跳轉(zhuǎn)的方式,這篇文章主要給大家介紹了關(guān)于Spring MVC重定向與轉(zhuǎn)發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-09-09
SpringBoot集成POI實現(xiàn)Excel導入導出的示例詳解
Apache?POI?是用Java編寫的免費開源的跨平臺的?Java?API,Apache?POI提供API給Java程序?qū)icrosoft?Office格式檔案讀和寫的功能。本文主要介紹通過SpringBoot集成POI工具實現(xiàn)Excel的導入和導出功能,需要的可以參考一下2022-07-07
Java黑科技之通過Google Java Style 文件配置IDEA和Ecplise代碼風格
在日常開發(fā)中,多人團隊協(xié)作開發(fā)一個項目是很常見的,特別是大公司,這就會涉及到多人在一個工程上開發(fā)代碼.無規(guī)矩不成方圓,一個好的代碼風格,更加有利于團隊協(xié)作,減少代碼沖突,提高代碼可閱讀性,美觀性.本文就帶著大家仔細研究這個黑科技 ,需要的朋友可以參考下2021-05-05
SpringBoot下獲取resources目錄下文件的常用方法
本文詳細介紹了SpringBoot獲取resources目錄下文件的常用方法,包括使用this.getClass()方法、ClassPathResource獲取以及hutool工具類ResourceUtil獲取,感興趣的可以了解一下2024-10-10
Java創(chuàng)建數(shù)組的幾種方式總結(jié)
下面小編就為大家?guī)硪黄狫ava創(chuàng)建數(shù)組的幾種方式總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10

