最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)把圖片處理到指定大小的操作方法

 更新時(shí)間:2025年03月11日 09:47:29   作者:laizhenghua  
項(xiàng)目開(kāi)發(fā)中,經(jīng)常遇到圖片上傳功能,發(fā)現(xiàn)如果圖片比較大時(shí),在查看、預(yù)覽、下載速度會(huì)特別慢,考慮到浪費(fèi)流量以及文件服務(wù)器的存儲(chǔ)空間,決定在后端優(yōu)化處理完再上傳,所以本文給大家介紹了使用Java把圖片處理到指定大小的操作方法,需要的朋友可以參考下

引言

項(xiàng)目開(kāi)發(fā)中,經(jīng)常遇到圖片上傳功能,發(fā)現(xiàn)如果圖片比較大時(shí),在查看、預(yù)覽、下載速度會(huì)特別慢,考慮到浪費(fèi)流量以及文件服務(wù)器的存儲(chǔ)空間,決定在后端優(yōu)化處理完再上傳,以減少存儲(chǔ)空間與優(yōu)化傳輸速率。這里使用Java自帶的ImageIO進(jìn)行處理分享給大家。

1、Java常見(jiàn)的圖像處理插件

  • Java自帶的ImageIO
  • Google的Thumbnails(實(shí)現(xiàn)也相對(duì)于比較簡(jiǎn)單,功能也更加豐富)-- 可自行了解

本文將使用兩種工具實(shí)現(xiàn)圖片的壓縮,在保持清晰度的前提下,去減少圖片的大小,以達(dá)到減少存儲(chǔ)空間與提高文件傳輸速率的目的。

2、圖片壓縮優(yōu)化實(shí)戰(zhàn)

以壓縮JPG文件為例,詳見(jiàn)下圖現(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圖像編寫(xiě)器
    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 無(wú)需壓縮!", 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();
}

再來(lái)看壓縮效果(dist.jpg為原文件),可以打開(kāi)文件進(jìn)行對(duì)比(清晰度基本沒(méi)啥變化)

到此這篇關(guān)于Java實(shí)現(xiàn)把圖片處理到指定大小的操作方法的文章就介紹到這了,更多相關(guān)Java圖片指定大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Feign遠(yuǎn)程調(diào)用傳遞對(duì)象參數(shù)并返回自定義分頁(yè)數(shù)據(jù)的過(guò)程解析

    Feign遠(yuǎn)程調(diào)用傳遞對(duì)象參數(shù)并返回自定義分頁(yè)數(shù)據(jù)的過(guò)程解析

    這篇文章主要介紹了Feign遠(yuǎn)程調(diào)用傳遞對(duì)象參數(shù)并返回自定義分頁(yè)數(shù)據(jù)的過(guò)程解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解Mybatis(五)Mapper接口

    詳解Mybatis(五)Mapper接口

    這篇文章主要介紹了Mybatis Mapper接口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解

    Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解

    棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解
    2022-02-02
  • javaweb購(gòu)物車案列學(xué)習(xí)開(kāi)發(fā)

    javaweb購(gòu)物車案列學(xué)習(xí)開(kāi)發(fā)

    這篇文章主要為大家詳細(xì)介紹了javaweb購(gòu)物車案列學(xué)習(xí)開(kāi)發(fā)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 詳細(xì)聊聊Spring MVC重定向與轉(zhuǎn)發(fā)

    詳細(xì)聊聊Spring MVC重定向與轉(zhuǎn)發(fā)

    大家應(yīng)該都知道請(qǐng)求重定向和請(qǐng)求轉(zhuǎn)發(fā)都是web開(kāi)發(fā)中資源跳轉(zhuǎn)的方式,這篇文章主要給大家介紹了關(guān)于Spring MVC重定向與轉(zhuǎn)發(fā)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • SpringBoot集成POI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解

    SpringBoot集成POI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解

    Apache?POI?是用Java編寫(xiě)的免費(fèi)開(kāi)源的跨平臺(tái)的?Java?API,Apache?POI提供API給Java程序?qū)icrosoft?Office格式檔案讀和寫(xiě)的功能。本文主要介紹通過(guò)SpringBoot集成POI工具實(shí)現(xiàn)Excel的導(dǎo)入和導(dǎo)出功能,需要的可以參考一下
    2022-07-07
  • Java黑科技之通過(guò)Google Java Style 文件配置IDEA和Ecplise代碼風(fēng)格

    Java黑科技之通過(guò)Google Java Style 文件配置IDEA和Ecplise代碼風(fēng)格

    在日常開(kāi)發(fā)中,多人團(tuán)隊(duì)協(xié)作開(kāi)發(fā)一個(gè)項(xiàng)目是很常見(jiàn)的,特別是大公司,這就會(huì)涉及到多人在一個(gè)工程上開(kāi)發(fā)代碼.無(wú)規(guī)矩不成方圓,一個(gè)好的代碼風(fēng)格,更加有利于團(tuán)隊(duì)協(xié)作,減少代碼沖突,提高代碼可閱讀性,美觀性.本文就帶著大家仔細(xì)研究這個(gè)黑科技 ,需要的朋友可以參考下
    2021-05-05
  • Java解壓zip文件的關(guān)鍵代碼

    Java解壓zip文件的關(guān)鍵代碼

    本文給大家分享一段java解壓zip文件的關(guān)鍵代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • SpringBoot下獲取resources目錄下文件的常用方法

    SpringBoot下獲取resources目錄下文件的常用方法

    本文詳細(xì)介紹了SpringBoot獲取resources目錄下文件的常用方法,包括使用this.getClass()方法、ClassPathResource獲取以及hutool工具類ResourceUtil獲取,感興趣的可以了解一下
    2024-10-10
  • Java創(chuàng)建數(shù)組的幾種方式總結(jié)

    Java創(chuàng)建數(shù)組的幾種方式總結(jié)

    下面小編就為大家?guī)?lái)一篇Java創(chuàng)建數(shù)組的幾種方式總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10

最新評(píng)論

乐业县| 弥勒县| 临海市| 黄浦区| 休宁县| 仲巴县| 泉州市| 蒙阴县| 通许县| 辰溪县| 台北县| 探索| 呼伦贝尔市| 寻乌县| 宜城市| 都匀市| 大同县| 台中县| 龙陵县| 廉江市| 都昌县| 西平县| 苏州市| 金坛市| 大厂| 清原| 巴青县| 武山县| 区。| 西吉县| 霞浦县| 淮北市| 龙游县| 治多县| 德兴市| 吐鲁番市| 尼木县| 桂东县| 晋江市| 静宁县| 马鞍山市|