关键词搜索

源码搜索 ×
×

Java操作Google Webp图片格式转换实践

发布2019-03-27浏览5729次

详情内容

目录

webp压缩的好处

 Java使用webp代码编译

Webp开源项目

nintha/webp-imageio-core

qwong/j-webp

可用的webp依赖和包

Webp 编解码

编码

解码

Webp遇到的坑

文件释放

阿里云Linux内核版本差异


 

webp压缩的好处

可以缩小网络传输和磁盘占用空间。

 

 Java使用webp代码编译

  1. webp-imageio
    开源库 下载压缩包到本地进行编译jar,工程用gradle来维护。

  2. libwebp
    google-developer下载压缩包到本地编译动态链接库-不同平台的动态链接库编译出来是不同的。mac下是.dylib, windowns下是.dll, unix/linux下是.so. 我在mac和linux下编译过,记录下linux下编译过程。

  3. compiling

  1. libwebp-0.6.1.tar.gz luciad-webp-imageio-8f9b44b41902.zip
  2. tar -xzvf libwebp-0.6.1.tar.gz
  3. unzip luciad-webp-imageio-8f9b44b41902.zip
  4. mv libwebp-0.6.1 ./luciad-webp-imageio-8f9b44b41902/libwebp
  1. cd luciad-webp-imageio-8f9b44b41902
  2. cmake .
  3. cmake --build .

cmake如果装的话,请自行下载安装官网 安装用法

./gradlew build -x test
  1. java project
    将libwebp-imageio.so放入工程的当前目录,因为默认的java.library.path含工程当前路径。同时引入打好的luciad-webp-imageio-8f9b44b41902-0.6.0-SNAPSHOT.jar引入工程中。如果是maven工程的话,可以把jar先推到远程的仓库里。
  • java transfer
  1. image = ImageIO.read(new URL(imageUrl));
  2. // Encode it as webp using default settings
  3. boolean result = ImageIO.write(image, "webp", bos);
  • gradle push to repositry
    update build.gradle
  1. apply plugin: "maven-publish" //插件required
  2. group = "com.luciad.imageio.webp"
  3. publishing {
  4. publications {
  5. mavenJava(MavenPublication) {
  6. from components.java
  7. }
  8. }
  9. repositories {
  10. maven {
  11. url "http://***"
  12. credentials {
  13. username = ****
  14. password = ****
  15. }
  16. }
  17. }
  18. }

publish

gradle publishMavenPublicationToMavenRepository

有时间的话可以自己编译,此处来自:https://www.jianshu.com/p/5827f9063fe9

Webp开源项目

nintha/webp-imageio-core

qwong/j-webp

可用的webp依赖和包

下载此开源项目没有跑起来,dll包有问题。直接使用0.4.2可以正常使用,下载地址如下:

Webp 编解码

编码

  1. package example;
  2. import com.luciad.imageio.webp.WebPWriteParam;
  3. import javax.imageio.IIOImage;
  4. import javax.imageio.ImageIO;
  5. import javax.imageio.ImageWriter;
  6. import javax.imageio.stream.FileImageOutputStream;
  7. import java.awt.image.BufferedImage;
  8. import java.io.File;
  9. import java.io.IOException;
  10. public class EncodeTest {
  11. public static void main(String args[]) throws IOException {
  12. String inputPngPath = "test_pic/test.png";
  13. String inputJpgPath = "test_pic/test.jpg";
  14. String outputWebpPath = "test_pic/test_.webp";
  15. // Obtain an image to encode from somewhere
  16. BufferedImage image = ImageIO.read(new File(inputJpgPath));
  17. // Obtain a WebP ImageWriter instance
  18. ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();
  19. // Configure encoding parameters
  20. WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());
  21. writeParam.setCompressionMode(WebPWriteParam.MODE_DEFAULT);
  22. // Configure the output on the ImageWriter
  23. writer.setOutput(new FileImageOutputStream(new File(outputWebpPath)));
  24. // Encode
  25. long st = System.currentTimeMillis();
  26. writer.write(null, new IIOImage(image, null, null), writeParam);
  27. System.out.println("cost: " + (System.currentTimeMillis() - st));
  28. }
  29. }

解码

  1. package example;
  2. import com.luciad.imageio.webp.WebPReadParam;
  3. import javax.imageio.ImageIO;
  4. import javax.imageio.ImageReader;
  5. import javax.imageio.stream.FileImageInputStream;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.IOException;
  9. public class DecodeTest {
  10. public static void main(String args[]) throws IOException {
  11. System.load("C:\\Users\\admin\\Desktop\\webp\\webp-code\\webp-imageio-core\\src\\main\\resources\\META-INF\\lib\\windows_64\\webp-imageio.dll");
  12. String inputWebpPath = "test_pic/test.webp";
  13. String outputJpgPath = "test_pic/test_.jpg";
  14. String outputJpegPath = "test_pic/test_.jpeg";
  15. String outputPngPath = "test_pic/test_.png";
  16. // Obtain a WebP ImageReader instance
  17. ImageReader reader = ImageIO.getImageReadersByMIMEType("image/webp").next();
  18. // Configure decoding parameters
  19. WebPReadParam readParam = new WebPReadParam();
  20. readParam.setBypassFiltering(true);
  21. // Configure the input on the ImageReader
  22. reader.setInput(new FileImageInputStream(new File(inputWebpPath)));
  23. // Decode the image
  24. BufferedImage image = reader.read(0, readParam);
  25. ImageIO.write(image, "png", new File(outputPngPath));
  26. ImageIO.write(image, "jpg", new File(outputJpgPath));
  27. ImageIO.write(image, "jpeg", new File(outputJpegPath));
  28. }
  29. }

Webp遇到的坑

文件释放

需要注意在用完文件流之后记得关闭,否则删除文件会失败

阿里云Linux内核版本差异

在三台Centos的阿里云 服务器上三个内核版本,其中有台服务器webp不报错但就是程序阻塞到webp调用然后返回http404:

正常内核版本:

 

异常内核版本:

更多阅读:

https://segmentfault.com/a/1190000016324137

https://blog.csdn.net/xu_san_duo/article/details/79085718

webp-imageio 如何编译及使用 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载