🐷

JavaScriptでAVIFをJPEGに変換する

2022/03/17に公開

AVIF 形式の画像は Mac のプレビューアプリだと閲覧できないので、手元で簡単に JPEG に変換したくなりました。Node.js を使えば JavaScript で簡単に変換できました。

構成
avif-to-jpeg
├── convert.js
├── package-lock.json
└── package.json

必要なパッケージはfs path sharpの3つです。

package.json
{
  "name": "avif-to-jpeg",
  "version": "0.0.1",
  "description": "Command line tool to convert AVIF to JPEG",
  "dependencies": {
    "fs": "^0.0.1-security",
    "path": "^0.12.7",
    "sharp": "^0.33.0"
  }
}

npm install fs path sharp とやってもいいです。

コードを書いていきます。sharpというライブラリが優秀でさまざまなファイル形式を相互に変換できるみたいです。参考

convert.js
const fs = require("fs").promises;
const path = require("path");
const sharp = require("sharp");

const convert = async (inputPath, outputDir) => {
  const obj = path.parse(inputPath);
  const outputPath = path.join(outputDir, `${obj.name}.jpg`);
  try {
    await sharp(inputPath).jpeg().toFile(outputPath);
  } catch (err) {
    console.error(err);
  }
};

const main = async () => {
  if (process.argv.length != 4) {
    console.log("node convert.js [input dir] [output dir]");
    process.exit(1);
  }

  const inputDir = process.argv[2];
  const outputDir = process.argv[3];
  try {
    const files = await fs.readdir(inputDir);
    const promises = files.map((file) => {
      const inputPath = path.join(inputDir, file);
      return convert(inputPath, outputDir);
    });
    await Promise.all(promises);
    process.exit(0);
  } catch (err) {
    console.error(err);
    process.exit(1);
  }
};

main();

あとは AVIF ファイルが入っているディレクトリと、出力先のディレクトリを指定してconvert.jsを実行すれば、全部 JPEG に変換できます。

$ mkdir ~/Desktop/jpeg-output
$ node convert.js ~/Desktop/avif-input ~/Desktop/jpeg-output

Discussion