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

Java圖片壓縮三種高效壓縮方案詳細(xì)解析

 更新時(shí)間:2025年04月08日 11:01:54   作者:很少更新  
圖片壓縮通常涉及減少圖片的尺寸縮放、調(diào)整圖片的質(zhì)量(針對(duì)JPEG、PNG等)、使用特定的算法來(lái)減少圖片的數(shù)據(jù)量等,這篇文章主要介紹了Java圖片壓縮三種高效壓縮方案的相關(guān)資料,需要的朋友可以參考下

一、基于OpenCV的智能尺寸壓縮

java public static void extracted2() { '
String path = "C:\test.jpg"; 
String savePath = "D:\compressed.jpg"; 
int maxWidth = 800; 
int maxHeight = 600; 
compressImage(new File(path), new File(savePath), maxWidth, maxHeight); 
}
compressImage 寫(xiě)法為kotlin語(yǔ)法法,需要自己轉(zhuǎn)換
fun compressImage(inputFile: File, outputFile: File, maxWidth: Int, maxHeight: Int) {
        try {
            val image = ImageIO.read(inputFile)
            val originalWidth = image.width
            val originalHeight = image.height
            var newWidth = originalWidth
            var newHeight = originalHeight

            // 計(jì)算新的寬度和高度,保持比例
            if (originalWidth > maxWidth || originalHeight > maxHeight) {
                val ratio = Math.min(maxWidth.toDouble() / originalWidth, maxHeight.toDouble() / originalHeight)
                newWidth = (originalWidth * ratio).toInt()
                newHeight = (originalHeight * ratio).toInt()
            }

            val resizedImage = BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB)
            resizedImage.createGraphics().apply {
                drawImage(image.getScaledInstance(newWidth, newHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null)
                dispose()
            }

            // 確保輸出目錄存在
            val outputPath: Path = Paths.get(outputFile.parent)
            if (!Files.exists(outputPath)) {
                Files.createDirectories(outputPath)
            }

            ImageIO.write(resizedImage, "jpg", outputFile)
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

技術(shù)亮點(diǎn):

  • 動(dòng)態(tài)尺寸調(diào)整:通過(guò)設(shè)置最大寬高(800x600),自動(dòng)保持原圖比例
  • OpenCV加持:使用Imgproc.resize()進(jìn)行高質(zhì)量縮放
  • 跨平臺(tái)支持:需配置OpenCV本地庫(kù)(System.loadLibrary)

適用場(chǎng)景:

  • 移動(dòng)端圖片展示
  • 用戶(hù)頭像上傳

二、JPEG質(zhì)量參數(shù)壓縮

java public static void extracted4() { 
	for (int i = 1; i <=10; i++) { 
		float quality = 0.1f * i; 
		compressImage(inputFile, outputFile, quality); 
	} 
}
public static void compressImage(File inputFile, File outputFile, float quality) throws IOException {
        // 讀取圖片
        BufferedImage image = ImageIO.read(inputFile);

        // 獲取圖片寫(xiě)入器
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("webp");
        ImageWriter writer = writers.next();

        // 設(shè)置寫(xiě)入器的輸出目標(biāo)
        ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
        writer.setOutput(ios);

        // 創(chuàng)建圖片寫(xiě)入器配置
        IIOImage imageIO = new IIOImage(image, null, null);
        ImageWriteParam param = writer.getDefaultWriteParam();

        // 設(shè)置壓縮質(zhì)量
        if (param.canWriteCompressed()) {
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(quality);
        }

        // 寫(xiě)入圖片
        writer.write(null, imageIO, param);

        // 關(guān)閉資源
        ios.close();
        writer.dispose();
    }

關(guān)鍵技術(shù):

  • 質(zhì)量梯度測(cè)試:從0.1到1.0進(jìn)行10級(jí)壓縮測(cè)試
  • 無(wú)損壓縮支持:通過(guò)ImageWriteParam控制壓縮模式
  • 視覺(jué)質(zhì)量平衡:找到文件大小與清晰度的最佳平衡點(diǎn)

壓縮效果對(duì)比:

質(zhì)量參數(shù)文件大小清晰度
0.345KB可接受
0.7120KB良好
1.0350KB無(wú)損

三、WebP高效格式轉(zhuǎn)換

public static void extracted6() {
        String path = "C:\\Users\\美眾\\Pictures\\test2.jpg";
        for (int i = 1; i <=10; i++) {
            float quality = 0.0f + i * 0.1f;
            System.out.println("quality:" + quality);
            String savePath = "D:\\save\\test2-webp-"+quality+".jpg";
            File inputFile = new File(path); // 原始圖片文件
            File outputFile = new File(savePath);
            try {
                jpg2webp(inputFile, outputFile,quality);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
public static void jpg2webp(File oldfile, File newfile,float quality){
        try {
            // 獲取原始文件的編碼
            BufferedImage image = ImageIO.read(oldfile);
            // 創(chuàng)建WebP ImageWriter實(shí)例
            ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();
            // 配置編碼參數(shù)
            WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());
            // 設(shè)置壓縮模式
            writeParam.setCompressionMode(WebPWriteParam.MODE_EXPLICIT);
            System.out.println("getCompressionTypes:"+JSON.toJSON(writeParam.getCompressionTypes()));
//            "Lossy"-有損,"Lossless"-無(wú)損
            writeParam.setCompressionType(writeParam.getCompressionTypes()[0]);
            writeParam.setCompressionQuality(quality);
            // 配置ImageWriter輸出
            writer.setOutput(new FileImageOutputStream(newfile));
            // 進(jìn)行編碼,重新生成新圖片
            writer.write(null, new IIOImage(image, null, null), writeParam);
            System.out.println("jpg文件轉(zhuǎn)成webp格式成功");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

核心優(yōu)勢(shì):

  • 壓縮率提升:比JPEG節(jié)省25-35%空間
  • 透明通道支持:支持Alpha通道透明效果
  • 漸進(jìn)式加載:支持漸進(jìn)式解碼加載

性能對(duì)比:

格式質(zhì)量0.8加載速度兼容性
JPEG150KB100%
WebP95KB較快95%+

四、方案選型建議

  • 移動(dòng)端優(yōu)先:WebP + 質(zhì)量壓縮(0.6-0.8)
  • 用戶(hù)上傳處理:尺寸壓縮 + JPEG質(zhì)量0.7
  • 專(zhuān)業(yè)圖庫(kù)存儲(chǔ):OpenCV雙算法校驗(yàn)(直方圖對(duì)比+尺寸壓縮)

總結(jié) 

到此這篇關(guān)于Java圖片壓縮三種高效壓縮方案的文章就介紹到這了,更多相關(guān)Java圖片高效壓縮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)JDBC批量插入原理詳解

    Java實(shí)現(xiàn)JDBC批量插入原理詳解

    在JDBC中,executeBatch這個(gè)方法可以將多條dml語(yǔ)句批量執(zhí)行,效率比單條執(zhí)行executeUpdate高很多,這是什么原理呢?在mysql和oracle中又是如何實(shí)現(xiàn)批量執(zhí)行的呢?本文將給大家介紹這背后的原理
    2023-03-03
  • Java之實(shí)現(xiàn)十進(jìn)制與十六進(jìn)制轉(zhuǎn)換案例講解

    Java之實(shí)現(xiàn)十進(jìn)制與十六進(jìn)制轉(zhuǎn)換案例講解

    這篇文章主要介紹了Java之實(shí)現(xiàn)十進(jìn)制與十六進(jìn)制轉(zhuǎn)換案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • springboot如何解決跨域后session獲取不到sessionId不一致

    springboot如何解決跨域后session獲取不到sessionId不一致

    這篇文章主要介紹了springboot如何解決跨域后session獲取不到sessionId不一致問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 約定優(yōu)于配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    約定優(yōu)于配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    以前做項(xiàng)目,總是寫(xiě)Ant配置文件,滿足于自己更靈活的配置,而沒(méi)有去思考,這么做到底值不值得
    2017-08-08
  • Java實(shí)現(xiàn)AC自動(dòng)機(jī)全文檢索示例

    Java實(shí)現(xiàn)AC自動(dòng)機(jī)全文檢索示例

    本篇文章主要介紹了Java實(shí)現(xiàn)AC自動(dòng)機(jī)全文檢索示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • java通過(guò)URLClassLoader類(lèi)加載器加載外部jar代碼示例

    java通過(guò)URLClassLoader類(lèi)加載器加載外部jar代碼示例

    ClassLoader翻譯過(guò)來(lái)就是類(lèi)加載器,普通的java開(kāi)發(fā)者其實(shí)用到的不多,但對(duì)于某些框架開(kāi)發(fā)者來(lái)說(shuō)卻非常常見(jiàn),下面這篇文章主要給大家介紹了關(guān)于java通過(guò)URLClassLoader類(lèi)加載器加載外部jar的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java獲取調(diào)用當(dāng)前方法的類(lèi)名或方法名(棧堆信息)的四種方式舉例

    Java獲取調(diào)用當(dāng)前方法的類(lèi)名或方法名(棧堆信息)的四種方式舉例

    在Java編程中我們經(jīng)常需要在運(yùn)行時(shí)獲取當(dāng)前執(zhí)行的方法名稱(chēng),這在日志記錄、性能監(jiān)控、調(diào)試等方面非常有用,這篇文章主要給大家介紹了關(guān)于Java獲取調(diào)用當(dāng)前方法的類(lèi)名或方法名(棧堆信息)的四種方式,需要的朋友可以參考下
    2024-09-09
  • Java中的DelayQueue源碼解析

    Java中的DelayQueue源碼解析

    這篇文章主要介紹了Java中的DelayQueue源碼解析,一個(gè)實(shí)現(xiàn)PriorityBlockingQueue實(shí)現(xiàn)延遲獲取的無(wú)界隊(duì)列,在創(chuàng)建元素時(shí),可以指定多久才能從隊(duì)列中獲取當(dāng)前元素,只有延時(shí)期滿后才能從隊(duì)列中獲取元素,需要的朋友可以參考下
    2023-12-12
  • java類(lèi)中serialVersionUID的作用及其使用

    java類(lèi)中serialVersionUID的作用及其使用

    這篇文章主要介紹了java類(lèi)中serialVersionUID的作用及其使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 借助Maven搭建Hadoop開(kāi)發(fā)環(huán)境的最詳細(xì)教程分享

    借助Maven搭建Hadoop開(kāi)發(fā)環(huán)境的最詳細(xì)教程分享

    在Maven插件的幫助下,VSCode寫(xiě)Java其實(shí)非常方便,所以本文就來(lái)和大家詳細(xì)講講如何借助maven用VScode搭建Hadoop開(kāi)發(fā)環(huán)境,需要的可以參考下
    2023-05-05

最新評(píng)論