🐷
JavaScriptでAVIFをJPEGに変換する
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