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多家了,如果通过这种方式,那无疑增加了很大的项目部署的成本。
然后又发现原来上面的 Tinypng 和 Jdeli 这两款收费软件都是以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了,就是这么简单,效果完美。