項目中有個需求是要將客戶上傳的圖片壓縮,要求是使圖片體積變小,可是分辨率不變。java
網上主流的方式有兩種,一種是採用java原生的BufferImage來壓縮,第二種就是谷歌提供的Thumbnails壓縮,這兩種方式對於除png之外的其餘格式圖片的處理都是沒有問題的,可是對於png圖片,因爲png支持的不規則圖片,透明背景問題,致使壓縮後的照片背景變黑,網上所說的能夠背景不變黑的方式處理後背景沒有變黑可是圖片分辨率下降了。這都是達不到要求的。git
接着找到了一款收費Api,Tinypng。相信研究過png壓縮的同窗不少都看到過這款軟件,這款軟件能夠達到要求,可是,他是收費的,每個月限制壓縮次數500次,超出部分收費。一樣的還有一款Jdeli 軟件,他也提供了java Api,可是一樣收費。github
接着又找到一款名爲pngquant的開源軟件,只不過它是用c開發的,java要想調用的話只能把它打成so或dll庫,經過jni調用,先不說不少同窗沒接觸過jni,即便不考慮實現難度的問題,他仍有一個很嚴重的問題就是,打成的so庫須要放在Java.library.path下,這就意味着要在生產服務器上部署時,須要去改變生產服務器的配置。而咱們的項目,因爲業務需求,一樣一款項目部署在不一樣服務器上,一家代理一個服務器,目前已經有50多家了,若是經過這種方式,那無疑增長了很大的項目部署的成本。算法
而後又發現原來上面的 Tinypng 和 Jdeli 這兩款收費軟件都是以pngquant這個開源項目爲基礎開發的,讓人挺無語的,這裏面好像有商機?服務器
研究了很長時間後,又發現了一款pdf渲染的開源軟件OpenViewerFX,而這款軟件裏面提供了Png圖片壓縮的接口。一樣是以pngquant的算法爲基礎實現的,效果與上面的幾款軟件相同,可是重要的是,它是開源的!他是開源的!它是開源的!maven
並且他是java語言開發的,提供了jar包,開放了png圖片處理的接口。下面說如何經過這款軟件對png圖片壓縮。spa
github地址:代理
https://github.com/qwertme/OpenViewerFXcode
maven引用:blog
<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了,就是這麼簡單,效果完美。