什么是 WebP
WebP 是图片格式的发展趋势
WebP(发音:weppy)是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,派生自影像编码格式VP8,被认为是WebM多媒体格式的姊妹项目,是由Google在购买On2 Technologies后发展出来,以BSD授权条款发布。
根据Google的测试,无损压缩后的WebP比PNG文件少了26%的体积,有损压缩后的WebP图片相比于等效质量指标的JPEG图片减少了25%~34%的体积。
前端图片转WebP
既然webp那么好, 我们需要如何才能使用呢, 其实现在我们js就已经可以借助canvas将图片转换为webp格式了
读取本地文件
1 | function handleDraw({ target }) { |
渲染到Image, 填充给 canvas
这里使用Image对象, 不用使用img标签
1 | function viewImage(file) { |
canvas压缩并下载图片
canvas还可以处理很多需求得图片, 等有空去百度找找写来看
canvas.toDataURL 方法可以将canvas上得画面生成base64得图片链接
1 | function handleDraw({ target }) { |
需要下载图片的话还需要将base64转换为blob二进制数据
data:image/webp;base64, ...
再;base64,
后面是二进制数据, 前面是文件类型, 通过拆分;base64,
后, 再拆分:
, 数据和类型都得到了
1 | function baseToBolb(base) { |
blob
文件下载的话只需要借助URl.createObjectURL方法就可以了
1 | async function saveFile(blob, fileName = "test.webp") { |
通过前端进行图片压缩, 可以节省带宽流量, 减轻服务器压力, 但是通过canvas压缩达不到webp最好得效果, 而且不支持动态gif图片的转换, 这个时候我们就需要挪到后端进行处理了
后端WebP操作
安装依赖
1 | npm install -save webp-converter |
image Format To WebP
1 | const webp = require('webp-converter') |
WebP to other image format
1 | // input, output, option |
Convert gif image to webp
1 | // input, output, option |
这个库还有其他高级的动画操作方法, 这里就给出常用的一些方法
转换目录下所有图片
1 | const fs = require('fs').promises |
检查浏览器是否支持webp
在浏览器中可以采用JavaScript检测是否支持WebP,对支持WebP的用户输出WebP图片,否则输出其他格式的图片。
JavaScript检测是否支持WebP代码如下:(出自Google官方文档)
1 | function check_webp_feature(feature, callback) { |
在浏览器向服务器发起请求时,对于支持WebP图片的浏览器,会在请求头Accept中带上image/webp的信息,服务器便能识别到浏览器是否支持WebP,在服务器中处理图片。