图片转换成webp

webp的几个问题

1. 什么是webp?

最直接的就是一个图片的后缀是.webp而不是.png/.jpeg等,官方的说法就是由Google开发的一种用于图像压缩的现代格式,目的就是减小图片的大小从而提高网页加载速;

2. 是不是所有浏览器都支持webp图片?如何判断浏览器是否支持webp格式的图片

不是所有的浏览器都支持 WebP 图片格式,但大多数主流的现代浏览器都已经支持了。以下是一些常见的浏览器对 WebP 格式的支持情况:

  • Google Chrome:支持 WebP 格式。
  • Mozilla Firefox:支持 WebP 格式。
  • Microsoft Edge:支持 WebP 格式。
  • Safari:从 Safari 14 开始,支持 WebP 格式 要判断浏览器是否支持 WebP 格式的图片,可以使用 JavaScript 进行检测。以下是一种常用的方法:
js 复制代码
function isWebPSupported() {
  var elem = document.createElement('canvas');
  if (!!(elem.getContext && elem.getContext('2d'))) {
    // canvas 支持
    return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;
  }
  // canvas 不支持
  return false;
}

if (isWebPSupported()) {
  console.log('浏览器支持 WebP 格式');
} else {
  console.log('浏览器不支持 WebP 格式');
}

上述代码通过创建一个 canvas 元素,并尝试将其转换为 WebP 格式的图片。如果浏览器支持 WebP 格式,则会返回一个以 "data:image/webp" 开头的数据 URL。

通过这种方式,你可以在网页中使用 JavaScript 检测浏览器是否支持 WebP 格式,并根据需要提供适当的替代图片

3. 图片转换成webp之后一定会比之前的图片更小吗?

答案是否定的。一般来说,具有大量细节、颜色变化和复杂结构的图像可能会在转换为 WebP 格式后获得更好的压缩效果,反之有些转换后可能会比之前更大;所以最好是图片转换为 WebP 格式之前,建议进行测试和比较不同压缩参数和质量级别的结果,以找到最佳的压缩设置,对最终转换后变成更大的建议不做转换

4. 如何将图片转换成webp

  • 图像编辑软件 如 Adobe Photoshop、GIMP 或在线工具,如 Google 的 WebP 编码器。这些工具可以让你将现有的图像转换为 WebP 格式,并选择压缩质量和压缩类型(有损或无损)
  • 插件转换webp插件文档链接接入

5. 项目中如何接入??

思路:

  • 第一步肯定是转化将项目中的存储的图片文件通过插件转换出webp格式的图片
  • 判断网页运行的浏览器是否支持webp格式的图片,如果支持,将项目中所有使用png/jpeg的图片的全部替换成webp

6. 转换出项目中图片的webp格式的图片

js 复制代码
const imagemin = require("imagemin");
const imageminWebp = require("imagemin-webp");

function transformToWebp(destination, filePaths) {
    await imagemin([filePath || `${destination}/*.{jpg,png}`], {
        destination: `${destination}/webp/`, // 转换出的webp图片放置在什么目录
        plugins: [imageminWebp({quality: 75})] // 使用imageminWebp转换转换质量级别设置多少
    })
}

具体到项目中,我们只希望转换我们当前正在开发的文件夹中的图片,而且已经转化的未作修改的就不要再重复转化; 如何知道哪些是新增的或者修改的呢? 想一想🤔️,是不是"git status"可以看到 所以开始做如下调整

js 复制代码
// 获取git仓库中发生变更的文件列表
function getGitStatusChangedImgFiles() {
  return String(execSync('git status -s'))
      .split('\n')
      .map(item => item.split(' ').pop()
      .filter(path => path.match(/\.(jpg)|(png)/))
      );
};

返回一个包含变更图片文件路径的数组['src/example/image/a.png','src/example/image/b.png', '......']

js 复制代码
const imgPaths = getGitStatusChangedImgFiles()
async function transformAllChangedImgToWebp() {
    const resData = await promise.all(
        imgPaths.map(path => {
            const imgDir = path.replace(/([^\\/]+)\.([^\\/]+)/i, "") // src/banners/guardian_8/img/95_copy.png => src/banners/guardian_8/img/
            return transformToWebp(imgDir, path)
        })
    ) 
    const allDestinationPaths = resData.map((subArr) => subArr[0].destinationPath)
    // 如果这里我们想将生成的webp图片自动的add上去,那么就这样:
    execSync(`git add ${allDestinationPaths.join(" ")}`);
}

什么时候转换成webp最好?

我们在commit的时候进行转换图片,以及自动将转换的图片进行提交 这样我们就可以运用git的钩子函数处理了;

js 复制代码
npm install husky --save-dev

// .husky/pre-commit中
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

current_branch=`git rev-parse --abbrev-ref HEAD`

if [[ $current_branch === 'main']]; then
    # 生成 webp 图片
    npm run webp -- commit
fi

这样在我们commit时就会自动触发pre-commit钩子函数,在package.json中配置webp执行的脚步,执行上述transformAllChangedImgToWebp函数,然后在里面转换出webp图片并将新生成的webp自动git add上去,最后一并commit;

知识点

1. execSync是什么?

execSync 是一个 Node.js 内置模块 child_process 中的方法,用于同步执行外部命令。在 Node.js 中,child_process 模块提供了一组用于创建子进程的函数,其中包括 execSync 方法。execSync 方法用于执行指定的命令,并等待命令执行完成后返回结果。

js 复制代码
const { execSync } = require('child_process'); const output = execSync(command, options);

2. git status -s 会显示每个文件的状态信息

  • A:新增文件
  • M:修改文件
  • D:删除文件
  • R:文件名修改
  • C:文件的拷贝
  • U:未知状态

3. execSync('git status -s')返回值是什么?

通过String后就可以变成可见的字符串了,然后通过分割等就能拿到具体的修改的文件路径

4. Husky是什么?

Husky 是一个用于在 Git 提交过程中执行脚本的工具。它可以帮助开发人员在代码提交前或提交后执行一些自定义的脚本,例如代码格式化、代码质量检查、单元测试等。Husky 可以确保团队成员在提交代码之前遵循一致的规范和约定。

Husky 的工作原理是通过在 Git 钩子(Git hooks)中注册脚本来实现的。Git 钩子是在特定的 Git 事件发生时执行的脚本,例如在提交代码前执行 pre-commit 钩子,或在提交代码后执行 post-commit 钩子。push代码前执行pre-push的钩子、编写提交信息时执行commit-msg的钩子可用于提交什么规范

小结

  1. 通过execSync('git status -s')从中获取筛选当前新增/修改过的图片;
  2. 调用imagemin和imagemin-webp将图片转换出webp格式的图片
  3. husky的pre-commit中触发上述调用执行,并在里面顺道将新生成的webp一并add上去
  4. 至于后续生成的webp图片怎么使用,这将在下一篇文章中学习
相关推荐
百万蹄蹄向前冲1 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5812 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路2 小时前
GeoTools 读取影像元数据
前端
ssshooter3 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
Jerry3 小时前
Jetpack Compose 中的状态
前端
dae bal4 小时前
关于RSA和AES加密
前端·vue.js
柳杉4 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化
lynn8570_blog5 小时前
低端设备加载webp ANR
前端·算法
LKAI.5 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi
刺客-Andy5 小时前
React 第七十节 Router中matchRoutes的使用详解及注意事项
前端·javascript·react.js