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

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

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

引言

項(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中增強(qiáng)for循環(huán)代碼示例

    Java中增強(qiáng)for循環(huán)代碼示例

    這篇文章主要給大家介紹了Java中增強(qiáng)for循環(huán)的相關(guān)資料,for/in循環(huán)就是JDK5.0中所謂的增強(qiáng)For循環(huán),它能對(duì)數(shù)組和集合進(jìn)行遍歷,使用它會(huì)使用你的代碼短小而精煉的多,需要的朋友可以參考下
    2023-10-10
  • java基于dom4j包實(shí)現(xiàn)對(duì)XML解析的方法

    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
  • springboot3.x中Jakarta包無法引入的問題

    springboot3.x中Jakarta包無法引入的問題

    最近想將一些項(xiàng)目升級(jí)到springboot3.x和java17的時(shí)候,發(fā)現(xiàn)項(xiàng)目依賴中有Jakarta的包,但是代碼標(biāo)紅提示沒有相關(guān)的類,本文就來介紹一下解決方法,感興趣的可以了解一下
    2024-02-02
  • 淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡(jiǎn)單封裝

    淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡(jiǎn)單封裝

    這篇文章主要介紹了淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡(jiǎn)單封裝,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java BigDecimal類用法詳解

    Java BigDecimal類用法詳解

    BigDecimal 由任意精度的整數(shù)非標(biāo)度值 和32 位的整數(shù)標(biāo)度 (scale) 組成。如果為零或正數(shù),則標(biāo)度是小數(shù)點(diǎn)后的位數(shù)。如果為負(fù)數(shù),則將該數(shù)的非標(biāo)度值乘以 10 的負(fù)scale 次冪。
    2016-06-06
  • Java中正則表達(dá)式的使用和詳解(上)

    Java中正則表達(dá)式的使用和詳解(上)

    這篇文章主要介紹了Java中正則表達(dá)式的使用和詳解,包括匹配驗(yàn)證驗(yàn)證email是否正確,在字符串中查詢字符或者字符串的代碼實(shí)例,需要的朋友可以參考下
    2017-04-04
  • Springboot整合knife4j與shiro的操作

    Springboot整合knife4j與shiro的操作

    這篇文章主要介紹了Springboot整合knife4j與shiro的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體實(shí)例解析

    Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體實(shí)例解析

    本文是小編給大家總結(jié)的關(guān)于Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體的內(nèi)容,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • Mybatis中typeAliases的使用

    Mybatis中typeAliases的使用

    這篇文章主要介紹了Mybatis中typeAliases的使用,需要的朋友可以參考下
    2017-08-08
  • springbean的加載過程及應(yīng)用場(chǎng)景分析

    springbean的加載過程及應(yīng)用場(chǎng)景分析

    Bean已經(jīng)被實(shí)例化、屬性注入、初始化,并且注冊(cè)到容器中,可以被其他Bean或應(yīng)用程序使用,這篇文章主要介紹了springbean的加載過程以及應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2024-04-04

最新評(píng)論