【JavaEE】Java SDK實現圖片質量壓縮

2020-12-17 書客創作

很多時候,不快樂並不是因為快樂的條件沒有齊備,而是因為活得還不夠簡單。

本篇文章主要講的是通過Java SDK實現對圖片的質量壓縮,即圖片尺寸不變,壓縮圖片文件大小。而在本例中主要是徵對PNG圖片而言,再說Java SDK實現圖片質量壓縮之前,要先了解常見圖片的一些特性。

JPG格式

可支持有隕壓縮不支持透明不支持動畫非矢量

JPG圖片其實一生成出來就已經是有損的了,它是把一些不打算存儲的數據抹擦掉,它的色彩還原度比較好,可以支持適當壓縮後保持比較好的色彩度,如果你圖片顏色很多的,建議使用這個圖片格式,可以使生成的圖片大小比較小而不會使圖片看起來很模糊(失真) 。

JPEG格式

可支持有隕壓縮不支持透明不支持動畫非矢量

與jpg格式相似,經常在拷相片的時候看到得,但我們製作圖片的時候一般是保存jpg,該種圖片格式是文件相對jpg大,因為裡面存儲了很多相機裡的拍攝參數,像色相、飽和度、對比度等,可用於直接列印和印刷(相對於jpg要好) 。

PNG格式

不支持壓縮支持透明、半透明、不透明不支持動畫非矢量

網頁設計中為了使圖片下面的背景顏色顯示出來,我們經常會使用png24透明的圖片, png8是類似gif的透明度,有帶半透明(alpha為50%)的地方的時候以不透明處理。

png圖片如果色彩較多或複雜,則圖片生成後的格式是很大的,相比較jpg的放有5~6倍之多,所以沒特別要求不能以png替代jpg的使用。png圖片多用於網頁中的圖標設計。

IE6不支持png透明特性,有png的地方會以灰色底顯示,相當難看,不過ie6已經慢慢淡出了我們的視線,相信png的應用會得到更廣泛。

GIF格式

可支持有隕壓縮不支持全透明、半透明支持動畫非矢量

該格式的圖片位深相對較底,只支持web色顏色種類有限,無法過渡平滑。使用該格式的場景:網頁背景、小圖標、色彩度低的小切片、動畫圖片;

BMP格式

可支持有隕壓縮不支持透明不支持動畫非矢量

Windows格式,windows作業系統特有的圖片,該圖片保存了大量的圖片數據,所以圖片相對是比較大的,色彩度很真實,windows的桌面就是bmp格式的,通過設了桌面背景後,會在系統生成張bmp的圖片用於保存該桌面壁紙,缺點:圖片格式較大。

TIFF格式

不支持壓縮不支持透明不支持動畫非矢量

印刷格式,色彩真實,支持保存圖層(像psd,但像路徑、蒙版等不可保存),通常發給印刷公司的圖片就是用這種格式的。了解了常見格式圖片的一些特性之後,接下來就是本講的重點:Java SDK實現圖片質量壓縮。

分析

一、讀取文件:圖片文件是保存在內存當中,要想對其進行操作,首先要讀取它在內存中的數據,如果連數據都獲取不到,那就更別提壓縮處理了,這裡就牽扯到流,在javax.imageio.*包下提供了一個ImageIO類,該類提供ImageReader和ImageWriter來實現對圖片的讀取和寫入。

二、轉碼:通過上面介紹,可以知道能夠支持壓縮的圖片格式並不是很多,而jpeg能夠支持各種格式程度的壓縮方式,壓縮效果好。所以在不明確源文件格式的情況下,先轉碼成jpeg格式是一個不錯的選擇。

三、質量壓縮:ImageWriteParam這個對象提供setCompressionQuality可以對圖片進行壓縮,最後對壓縮之後的數據進行合成成圖片。

實現

首先要獲取圖片的BufferedImage流,即讀取圖片內存數據。

File file = new File(imagePath);// imagePath源文件路徑 BufferedImage bufferedImage = ImageIO.read(file);// 獲取BufferedImage流

其次獲取圖片文件的ImageWriter,來實現圖片文件的重構。

// 得到指定Format圖片的writer Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");// 得到迭代器 ImageWriter writer = (ImageWriter) iter.next(); // 得到writer

接下來就是比較核心的內容,壓縮圖片。

// 得到指定writer的輸出參數設置(ImageWriteParam) ImageWriteParam iwp = writer.getDefaultWriteParam(); iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 設置可否壓縮 iwp.setCompressionQuality(quality); // 設置壓縮質量參數,0~1,1為最高質量 iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED); ColorModel colorModel = ColorModel.getRGBdefault(); // 指定壓縮時使用的色彩模式 iwp.setDestinationType(new ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16))); // 開始打包圖片,寫入byte[] ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 取得內存輸出流 IIOImage iIamge = new IIOImage(bufferedImage, null, null); // 此處因為ImageWriter中用來接收write信息的output要求必須是ImageOutput // 通過ImageIo中的靜態方法,得到byteArrayOutputStream的ImageOutput writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream)); writer.write(null, iIamge, iwp);

最後獲取壓縮圖片的ByteArrayOutputStream,轉化成圖片文件。

// 獲取壓縮後的btye byte[] tempByte = byteArrayOutputStream.toByteArray(); // 創建輸出文件,outputPath輸出文件路徑,imgStyle目標文件格式(png) File outFile = new File(outputPath + "." + imgStyle); FileOutputStream fos = new FileOutputStream(outFile); fos.write(tempByte); fos.close();

到這裡圖片壓縮就已經全部完成,不過該方式壓縮對GIF的壓縮並不是很好,所以不適用於GIF。

相關焦點

  • 電子文檔中插入的圖片過大怎麼辦?詳述word圖片壓縮方法
    在工具欄裡面找到「壓縮圖片」,單擊並設置好參數,點擊確認就能夠對圖片進行壓縮了。圖片工具欄壓縮圖片中對壓縮參數的設置也是有一定講究的,如果胡亂設置,不僅不能達到預期的效果,反而影響文檔的質量。壓縮選項裡面的「僅應用於此圖片」,如果前面的勾打上,你的壓縮操作只針對當前圖片,不勾表示壓縮所有圖片。「刪除圖片的剪裁區域」針對的是在word中進行過圖片剪裁操作(剪裁操作只是將不需要的部分隱藏了,並沒有刪除)的,壓縮操作會把剪裁隱藏的部分刪除。解析度一欄可以設置圖片壓縮後的質量。
  • 圖片太大怎麼壓縮變小,這幾個方法值得收藏
    我們在日常的工作中多多少少都會用到圖片,特別要注意的是,在一些網站或者是APP中上傳圖片,需要考慮圖片的大小,同時還要注重圖片的質量,一張圖片如果質量不過關,是會影響用戶的體驗的,遇到過大的圖片我們會想辦法對圖片進行壓縮,儘可能的縮小圖片的大小。
  • PPT如何壓縮圖片&一鍵提取所有素材?
    >壓縮圖片時如何選擇解析度常用的 PPT 圖片壓縮方法為什麼有的圖片 PPT 壓縮後會模糊?如何壓縮 PPT 中的媒體文件如何一鍵提取 PPT 中的所有素材PPT 中的圖片質量在 Office 中,默認情況下圖片質量設置為列印( 220 ppi
  • 壓縮垃圾車圖片及價格
    我廠專業生產銷售壓縮垃圾車圖片及價格,提供最新最全的壓縮垃圾車圖片及價格,壓縮垃圾車圖片及價格大量現車供應,可貨到付款,全國各地均可送貨上面,各地壓縮垃圾車圖片及價格包上牌,也可按揭付款,可零首付辦理,歡迎諮詢。
  • 圖片太大怎麼壓縮變小?最簡單的圖片壓縮方法
    當我們在微博或論壇發帖的時候,經常會上傳一些配圖,但是部分網站出於節省流量的原因,會對圖片的大小進行限制,導致我們無法上傳原圖。這時候就需要對圖片進行壓縮,下面就教大家一個快速壓縮圖片的方法。 首先打開圖叫獸,點擊左側的壓縮圖片。
  • 如何把圖片壓縮變小?簡單教程分享!
    搞設計的小夥伴們經常和圖片打交道,是不是常常感覺圖片文件多很佔空間?想如果能把圖片壓縮變小就好了,今天小編就給大家分享簡單的教程,快來看看吧!教程一:迅捷壓縮軟體這個工具不但可以進行圖片壓縮,還可以進行PDF壓縮、視頻壓縮、PPT壓縮以及Word文檔壓縮,能輕鬆解決日常辦公的壓縮難題。具體教程如下:步驟一:到桌面找到該壓縮軟體,電腦上沒有的小夥伴可到任意的瀏覽器中搜索下載哦!步驟二:找到後雙擊打開軟體。進入軟體,在軟體功能區找到並點擊圖片壓縮按鈕。
  • 如何將一張圖片大小壓縮至200k以內
    如何將一張圖片大小壓縮至200k以內?將圖片壓縮到指定的大小是需要藉助到圖片壓縮軟體的,至於能把圖片壓縮到多小,這個就需要自己去實際操作了,壓縮一下你就會知道!下面小編介紹幾種圖片壓縮的工具以及使用的方法,感興趣的話可以來學習一下。
  • 使用java的html解析器實現自動重複抓取任意網站頁面
    使用java的html解析器實現自動重複抓取任意網站頁面 在線演示    本地下載如果你曾經開發過內容聚合類網站的話,使用程序動態整合來自不同頁面或者網站內容的功能肯定對於你來說非常熟悉
  • 如何壓縮圖片不失真
    經常使用圖片的親們都發現一個問題,即有時候圖片放大縮小會失真,那麼怎麼才能讓圖片進行壓縮有不失真呢,這就需要我們藉助軟體,即ps。下面我來說下如何壓縮圖片不失真。讓照片壓縮又不失真,其實真的不難,我們先在電腦上面安裝ps,然後點擊打開ps,進入ps界面。
  • 在手機上怎麼壓縮圖片?用這招就是這麼輕鬆!
    在我們日常娛樂和日常工作中,如果想要壓縮圖片的大小該怎麼辦呢?雖然之前小編寫過在電腦上如何壓縮圖片的方法,但是我們總不能出去時時刻刻攜帶電腦。所以小編最後找到了一個好方法,今天就來和大家分享一下在手機上怎麼壓縮圖片的方法。
  • 《有趣君推薦》002—圖片壓縮利器TinyPNG
    圖片壓縮利器TinyPNG今天推薦的工具是「TinyPNG」,這是一款圖片壓縮神器,無需下載軟體,在網頁即可操作。我們經常使用PNG圖片,但對加載時間感到很懊惱。 我們創造TinyPNG是想通過最好的壓縮方案讓我們的網站更快並且用起來更愉快。 我們在2014年增加了針對JPEG圖片的智能壓縮功能,在2016年新增了對動畫PNG的支持。
  • Photoshop教程:用PS CS6壓縮圖片攻略大全集
    對很多PS小白來說,對圖片的處理一竅不通,有的時候,證件照太大,報名考試提交後出現照片上傳錯誤,其中很多時候都是因為照片的大小出了問題。在此,」小白視界「根據大家的需求,在此寫下所有壓縮圖片的方法。圖片
  • Java實現冒泡排序算法
    2.你能用java實現冒泡排序嗎?3.你能寫出更優秀的冒泡排序代碼嗎?3.案例3.1.冒泡排序思想假設有一個待排序序列:[4, 5, 6, 3, 2, 1]。實現了一個冒泡排序。在這裡,請你先簡單思考一下:有沒有更優化的實現方式呢?我們先來分析一下冒泡排序算法的時間複雜度,結合代碼我們發現冒泡排序的時間複雜度是:O(n^2),有兩次for循環,這不是一個高效的算法對吧。
  • 108MP火了,圖片不壓縮,哪怕512G也不夠
    綜上所述,圖片不可能按原始數據存儲的,需要通過壓縮技術減少空間佔用。圖像壓縮技術圖像壓縮分為無損壓縮與有損壓縮。無損壓縮無損壓縮指可以從壓縮的數據中還原原始數據,常用的無損壓縮算法有霍夫曼(Huffman)算法和LZW(Lenpel-Ziv & Welch)壓縮算法。
  • TinyPng-免費批量壓縮圖片的神器
    之前蝦皮路介紹了Squoosh工具,但是因為 Squoosh 只能一次壓縮一張圖片,對於有批量的圖片壓縮需求,那每次一張一張的壓縮,肯定很不爽的,畢竟需要不斷的重複操作很多次。那麼有沒有免費的批量壓縮圖片的工具呢?答案肯定是有的。
  • PNG圖片體積太大怎麼壓縮?在線就能給圖片縮小體積
    PNG圖片是指可攜式網絡圖形,也是我們在平時常用的一種圖片格式,PNG圖片一般來說比較清晰,同樣的體積也比JPG格式的圖片略大一些,所以在使用的時候會碰到圖片太大了超過系統的限制需要縮小以後才能使用,那麼怎麼樣才能使圖片的體積降低呢?
  • Java面試題參考答案I
    它繼承於AbstractList,實現了List,RandomAccess,Cloneable,java.io.Serializable這些接口。ArrayList繼承了AbstractList,實現了List。它是一個數組隊列,提供了相關的添加、刪除、修改、遍歷等功能。