ShokaX

本地转换图片为avif格式

发布于 字数统计 1.1k 字 阅读时长 4 分钟

本地转换图片为avif格式

发布于 字数统计 1,143 阅读时长 6 分钟

需要先安装nodejs

需要转换为其它格式可将file.replace(/\.(jpg|jpeg|png)$/i, ".avif")的.avif改为相应格式

把所有需要转换为avif格式的图片,放在一个空目录中
格式化空目录

npm init -y

进入目录,安装sharp

npm install sharp

把以下内容,粘贴至convert.js脚本中,将此脚本和需要转换的图片放至同一目录中

const sharp = require("sharp");
const fs = require("fs");
const path = require("path");

const inputDir = ".";
const outputDir = "./images";

// 创建输出目录(如果不存在)
if (!fs.existsSync(outputDir)) {
  fs.mkdirSync(outputDir);
}

// 扫描当前目录
fs.readdirSync(inputDir).forEach(file => {
  // 忽略目录
  if (fs.statSync(file).isDirectory()) return;

  // 只处理 jpg/jpeg/png
  if (!file.match(/\.(jpg|jpeg|png)$/i)) return;

  const inputPath = path.join(inputDir, file);
  const outputPath = path.join(
    outputDir,
    file.replace(/\.(jpg|jpeg|png)$/i, ".avif")
  );

  sharp(inputPath)
    .avif({
      quality: 60,        // 推荐 40~60
      effort: 4           // 0~9,越大压缩越慢但体积更小
    })
    .toFile(outputPath)
    .then(info => {
      const originalSize = fs.statSync(inputPath).size;
      const newSize = fs.statSync(outputPath).size;
      const ratio = ((1 - newSize / originalSize) * 100).toFixed(1);

      console.log(` ${file} → ${path.basename(outputPath)} | 压缩 ${ratio}%`);
    })
    .catch(err => {
      console.error(` 处理失败: ${file}`, err.message);
    });
});

在这个目录的路径栏清空,输入cmd回车

执行命令,自动转换

node convert.js
5488 字 19 分钟
Astro ShokaX 主题强力驱动