java-png圖片壓縮,解決png圖片壓縮后背景變黑問題


項目中有個需求是要將客戶上傳的圖片壓縮,要求是使圖片體積變小,但是分辨率不變。

網上主流的方式有兩種,一種是采用java原生的BufferImage來壓縮,第二種就是谷歌提供的Thumbnails壓縮,這兩種方式對於除png以外的其他格式圖片的處理都是沒有問題的,但是對於png圖片,由於png支持的不規則圖片,透明背景問題,導致壓縮后的照片背景變黑,網上所說的可以背景不變黑的方式處理后背景沒有變黑但是圖片分辨率降低了。這都是達不到要求的。

接着找到了一款收費Api,Tinypng。相信研究過png壓縮的同學很多都看到過這款軟件,這款軟件可以達到要求,但是,他是收費的,每月限制壓縮次數500次,超出部分收費。同樣的還有一款Jdeli 軟件,他也提供了java Api,但是同樣收費。

接着又找到一款名為pngquant的開源軟件,只不過它是用c開發的,java要想調用的話只能把它打成so或dll庫,通過jni調用,先不說很多同學沒接觸過jni,即使不考慮實現難度的問題,他仍有一個很嚴重的問題就是,打成的so庫需要放在Java.library.path下,這就意味着要在生產服務器上部署時,需要去改變生產服務器的配置。而我們的項目,由於業務需求,同樣一款項目部署在不同服務器上,一家代理一個服務器,目前已經有50多家了,如果通過這種方式,那無疑增加了很大的項目部署的成本。

然后又發現原來上面的 TinypngJdeli 這兩款收費軟件都是以pngquant這個開源項目為基礎開發的,讓人挺無語的,這里面好像有商機?

研究了很長時間后,又發現了一款pdf渲染的開源軟件OpenViewerFX,而這款軟件里面提供了Png圖片壓縮的接口。同樣是以pngquant的算法為基礎實現的,效果與上面的幾款軟件相同,但是重要的是,它是開源的!他是開源的!它是開源的!

而且他是java語言開發的,提供了jar包,開放了png圖片處理的接口。下面說如何通過這款軟件對png圖片壓縮。

github地址:

https://github.com/qwertme/OpenViewerFX

maven引用:

<dependency>
    <groupId>org.jpedal</groupId>
    <artifactId>OpenViewerFX</artifactId>
    <version>6.6.14</version>
</dependency>

Demo:

import com.idrsolutions.image.png.PngCompressor;
import java.io.File;
public class PngTest {
public static void main(String[] args) throws Exception{
String filePath = "C:\\Users\\Owner\\Desktop\\圖片素材\\test1.png";
File file = new File(filePath);
File outfile=new File("C:\\Users\\Owner\\Desktop\\圖片素材\\test11.png");
PngCompressor.compress(file,outfile);
}
}

輸出結果對比:

 

 

 

 

 

 

 

可以看到圖片背景沒有變黑,尺寸沒有縮小,清晰度也保持的很好。完美解決所有問題。

OK了,就是這么簡單,效果完美。

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM