目录

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

libwebp-0.6.1.tar.gz luciad-webp-imageio-8f9b44b41902.ziptar -xzvf libwebp-0.6.1.tar.gz
unzip luciad-webp-imageio-8f9b44b41902.zip
mv libwebp-0.6.1 ./luciad-webp-imageio-8f9b44b41902/libwebp
cd luciad-webp-imageio-8f9b44b41902
cmake .
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
image = ImageIO.read(new URL(imageUrl));
// Encode it as webp using default settings
boolean result = ImageIO.write(image, "webp", bos);
  • gradle push to repositry
    update build.gradle
apply plugin: "maven-publish" //插件required
group = "com.luciad.imageio.webp"publishing {publications {mavenJava(MavenPublication) {from components.java}}repositories {maven {url "http://***"credentials {username = ****password = ****}}}
}

publish

gradle publishMavenPublicationToMavenRepository

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

Webp开源项目

nintha/webp-imageio-core

qwong/j-webp

可用的webp依赖和包

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

  • http://download.csdn.net/download/geeklei/8163329
  • https://download.csdn.net/download/geeklei/8161731
  • 链接:https://pan.baidu.com/s/1JZB_cNNr3Pf8sv2hdvu_-A
    提取码:zvql
    复制这段内容后打开百度网盘手机App,操作更方便哦

Webp 编解码

编码

package example;import com.luciad.imageio.webp.WebPWriteParam;import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class EncodeTest {public static void main(String args[]) throws IOException {String inputPngPath = "test_pic/test.png";String inputJpgPath = "test_pic/test.jpg";String outputWebpPath = "test_pic/test_.webp";// Obtain an image to encode from somewhereBufferedImage image = ImageIO.read(new File(inputJpgPath));// Obtain a WebP ImageWriter instanceImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();// Configure encoding parametersWebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());writeParam.setCompressionMode(WebPWriteParam.MODE_DEFAULT);// Configure the output on the ImageWriterwriter.setOutput(new FileImageOutputStream(new File(outputWebpPath)));// Encodelong st = System.currentTimeMillis();writer.write(null, new IIOImage(image, null, null), writeParam);System.out.println("cost: " + (System.currentTimeMillis() - st));}
}

解码

package example;import com.luciad.imageio.webp.WebPReadParam;import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class DecodeTest {public static void main(String args[]) throws IOException {System.load("C:\\Users\\admin\\Desktop\\webp\\webp-code\\webp-imageio-core\\src\\main\\resources\\META-INF\\lib\\windows_64\\webp-imageio.dll");String inputWebpPath = "test_pic/test.webp";String outputJpgPath = "test_pic/test_.jpg";String outputJpegPath = "test_pic/test_.jpeg";String outputPngPath = "test_pic/test_.png";// Obtain a WebP ImageReader instanceImageReader reader = ImageIO.getImageReadersByMIMEType("image/webp").next();// Configure decoding parametersWebPReadParam readParam = new WebPReadParam();readParam.setBypassFiltering(true);// Configure the input on the ImageReaderreader.setInput(new FileImageInputStream(new File(inputWebpPath)));// Decode the imageBufferedImage image = reader.read(0, readParam);ImageIO.write(image, "png", new File(outputPngPath));ImageIO.write(image, "jpg", new File(outputJpgPath));ImageIO.write(image, "jpeg", new File(outputJpegPath));}
}

Webp遇到的坑

文件释放

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

阿里云Linux内核版本差异

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

正常内核版本:

异常内核版本:

更多阅读:

https://segmentfault.com/a/1190000016324137

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

webp-imageio 如何编译及使用

Java操作Google Webp图片格式转换实践相关推荐

  1. 使用Google WebP图片格式帮助控制网站页面大小

    日期:2013-3-16  来源:GBin1.com 不管你相信或者不相信,随着互联网的快速发展网页也在持续不断的变大. 使 网页迅速膨胀的罪魁祸首不是大量使用的JavaScript库,CSS和无尽的 ...

  2. 用java对imagemagick进行图片格式转换,例如heic转成jpg

    在开发中上传图片功能中,会遇到上传heic格式的图片,但是目前对这格式是不支持,需要将格式转换成常见的jpg,png,jpeg等格式 "heic的格式是苹果针对iOS11专门研发的一个照片格 ...

  3. 【Android 安装包优化】WebP 图片转换 ( 使用 iSparta 转换 WebP 图片格式 | Google 提供的 libwebp 库 )

    文章目录 一.使用 iSparta 转换 WebP 图片格式 二.Google 提供的 libwebp 库 三.参考资料 一.使用 iSparta 转换 WebP 图片格式 isparta 工具已经停 ...

  4. 什么是WebP图片格式?如何在线把Webp格式转换为JPEG格式?

    我们有时候从互联网上下载图片会发现图片是WebP格式而不是常见的JPEG或者是PNG格式,用自带的图片处理软件无法打开,那么什么是WebP格式呢?我们该如何打开WebP格式的图片文件?需要进行图片处理 ...

  5. 【Android Gradle 插件】自定义 Gradle 插件优化图片 ① ( Android 中的 WebP 图片格式使用 | WebP 格式转换 | WebP 参考文档 )

    文章目录 一.Android 中的 WebP 图片格式使用 二.WebP 格式转换 三.WebP 参考文档 Android Plugin DSL Reference 参考文档 : Android St ...

  6. 图片格式转换 - .webp 转格式为 .png / .jpg

    图片格式转换 - .webp 转格式为 .png / .jpg 很多时候,网页上素材图片格式出现了.webp格式的,PS无法正常打开查看或使用,所以需要转换一下其他格式(如.png / .jpg 等等 ...

  7. Python 实现图片格式转换,jpg\png\webp等,附源码

    Python 实现图片格式转换,jpg\png\webp等,附源码 需要使用 PIL库,但python 3是无法安装该库的,如果是python 3安装pillow库即可. 1.安装 python 2 ...

  8. java 图片互转_JAVA 图片格式转换 jpg、jpeg、png格式互转

    最近项目遇到一些图片格式的问题,于是就写下这边博客,帮助记忆,代码如下: public static void main(String[] args) { //原文件路径 String src = & ...

  9. 【Android 安装包优化】WebP 图片格式性能测试 ( 测试 WebP 图片解码速度 | 测试 WebP 图片编码速度 )

    文章目录 一.测试 WebP 图片解码速度 二.测试 WebP 图片编码速度 三.参考资料 测试结果 : WebP 格式图片 , 解码快 , 编码慢 , 占用空间小 ; 在解码速度上 , WebP 格 ...

最新文章

  1. springboot集成prometheus
  2. 通用权限管理系统组件 (GPM - General Permissions Manager) 给信息管理系统加一个初始化的功能,调用存储过程...
  3. html number方法,JavaScript Number 对象
  4. Service Mesh 为什么从“趋势”走向“无聊”?
  5. 表级锁的mysql读写_Mysql的表级锁
  6. elementUI响应式布局@media:基于断点的隐藏类
  7. linux删除目录下文件的几种方法
  8. scala迭代器_Scala选项和迭代器示例
  9. 网吧如何修改dns服务器地址,网吧更改dns服务器地址
  10. 计算机的管理选项文件错误,如何修复Microsoft Teams错误文件在Windows PC中被锁定...
  11. MD5 文件校验之 java 实现
  12. Dynamic Scoping (动态范围)
  13. python写api接口实战
  14. CentOS6.5X86_64系统定制文档详细版
  15. Dijkstra-POJ-2387-Til the Cows Come Home
  16. 怎么判断数据是否符合某个统计学分布
  17. 人工神经网络基础概念、原理知识(补)
  18. 5.3.2 求解复杂装载问题
  19. python彩票统计软件_python彩票分析软件
  20. Android开发之骚扰电话,谷歌发布了Android 11 第二个版本 还增加了一个强化骚扰电话拦截的API...

热门文章

  1. unity创建纹理_创建带纹理的文本的技术
  2. GDAL支持中文路径-属性表支持中文配置
  3. [日推荐]『本本海报』内含程序员福利,不可描述~
  4. web打印的几种方法(2023)
  5. python/改变图片尺寸及分辨率/填充透明图片背景颜色
  6. 叶国富创业24年,门店超五千家,名创优品年营收百亿
  7. Vue 实现商品分类、列表、详情、购物车、搜索(vant)
  8. java同步和异步的区别_java中同步与异步的区别是什么?表现在哪里?
  9. android api 22 later,Android getResources().getDrawable()不贊成的API 22。
  10. windows操作系统的自启动项