Java圖片壓縮三種高效壓縮方案詳細解析
更新時間:2025年04月08日 11:01:54 作者:很少更新
圖片壓縮通常涉及減少圖片的尺寸縮放、調整圖片的質量(針對JPEG、PNG等)、使用特定的算法來減少圖片的數(shù)據(jù)量等,這篇文章主要介紹了Java圖片壓縮三種高效壓縮方案的相關資料,需要的朋友可以參考下
一、基于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 寫法為kotlin語法法,需要自己轉換 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 // 計算新的寬度和高度,保持比例 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() } }
技術亮點:
- 動態(tài)尺寸調整:通過設置最大寬高(800x600),自動保持原圖比例
- OpenCV加持:使用Imgproc.resize()進行高質量縮放
- 跨平臺支持:需配置OpenCV本地庫(System.loadLibrary)
適用場景:
- 移動端圖片展示
- 用戶頭像上傳
二、JPEG質量參數(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); // 獲取圖片寫入器 Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("webp"); ImageWriter writer = writers.next(); // 設置寫入器的輸出目標 ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile); writer.setOutput(ios); // 創(chuàng)建圖片寫入器配置 IIOImage imageIO = new IIOImage(image, null, null); ImageWriteParam param = writer.getDefaultWriteParam(); // 設置壓縮質量 if (param.canWriteCompressed()) { param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(quality); } // 寫入圖片 writer.write(null, imageIO, param); // 關閉資源 ios.close(); writer.dispose(); }
關鍵技術:
- 質量梯度測試:從0.1到1.0進行10級壓縮測試
- 無損壓縮支持:通過ImageWriteParam控制壓縮模式
- 視覺質量平衡:找到文件大小與清晰度的最佳平衡點
壓縮效果對比:
質量參數(shù) | 文件大小 | 清晰度 |
---|---|---|
0.3 | 45KB | 可接受 |
0.7 | 120KB | 良好 |
1.0 | 350KB | 無損 |
三、WebP高效格式轉換
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實例 ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next(); // 配置編碼參數(shù) WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale()); // 設置壓縮模式 writeParam.setCompressionMode(WebPWriteParam.MODE_EXPLICIT); System.out.println("getCompressionTypes:"+JSON.toJSON(writeParam.getCompressionTypes())); // "Lossy"-有損,"Lossless"-無損 writeParam.setCompressionType(writeParam.getCompressionTypes()[0]); writeParam.setCompressionQuality(quality); // 配置ImageWriter輸出 writer.setOutput(new FileImageOutputStream(newfile)); // 進行編碼,重新生成新圖片 writer.write(null, new IIOImage(image, null, null), writeParam); System.out.println("jpg文件轉成webp格式成功"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
核心優(yōu)勢:
- 壓縮率提升:比JPEG節(jié)省25-35%空間
- 透明通道支持:支持Alpha通道透明效果
- 漸進式加載:支持漸進式解碼加載
性能對比:
格式 | 質量0.8 | 加載速度 | 兼容性 |
---|---|---|---|
JPEG | 150KB | 快 | 100% |
WebP | 95KB | 較快 | 95%+ |
四、方案選型建議
- 移動端優(yōu)先:WebP + 質量壓縮(0.6-0.8)
- 用戶上傳處理:尺寸壓縮 + JPEG質量0.7
- 專業(yè)圖庫存儲:OpenCV雙算法校驗(直方圖對比+尺寸壓縮)
總結
到此這篇關于Java圖片壓縮三種高效壓縮方案的文章就介紹到這了,更多相關Java圖片高效壓縮內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot如何解決跨域后session獲取不到sessionId不一致
這篇文章主要介紹了springboot如何解決跨域后session獲取不到sessionId不一致問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01java通過URLClassLoader類加載器加載外部jar代碼示例
ClassLoader翻譯過來就是類加載器,普通的java開發(fā)者其實用到的不多,但對于某些框架開發(fā)者來說卻非常常見,下面這篇文章主要給大家介紹了關于java通過URLClassLoader類加載器加載外部jar的相關資料,需要的朋友可以參考下2024-01-01Java獲取調用當前方法的類名或方法名(棧堆信息)的四種方式舉例
在Java編程中我們經常需要在運行時獲取當前執(zhí)行的方法名稱,這在日志記錄、性能監(jiān)控、調試等方面非常有用,這篇文章主要給大家介紹了關于Java獲取調用當前方法的類名或方法名(棧堆信息)的四種方式,需要的朋友可以參考下2024-09-09借助Maven搭建Hadoop開發(fā)環(huán)境的最詳細教程分享
在Maven插件的幫助下,VSCode寫Java其實非常方便,所以本文就來和大家詳細講講如何借助maven用VScode搭建Hadoop開發(fā)環(huán)境,需要的可以參考下2023-05-05