NodeJS 批量转换整个文件夹的图像与夏普

h5qlskok  于 2023-10-17  发布在  Node.js
关注(0)|答案(2)|浏览(102)

我有一个项目,我需要批量转换大量的.png文件到. jpg,与一些控制压缩质量。使用节点模块sharp就像对单个文件的魅力,例如:

const sharp = require("sharp");

sharp("input/82.png")
  .toFormat("jpeg")
  .jpeg({ quality: 70 })
  .toFile("output/82.jpg");

但我有几百个文件需要一次转换。我曾希望能够使用一些文件,如:

sharp("input/*.png")
  .toFormat("jpeg")
  .jpeg({ quality: 70 })
  .toFile("output/*.jpg");

当然,这是行不通的,我也没有尝试遍历所有文件,或者使用节点模块glob。感谢您在这里提供的任何指导。

yrefmtwq

yrefmtwq1#

在另一位开发人员的帮助下,答案比我预期的要复杂一些,需要使用节点模块glob

// example run : node sharp-convert.js ~/Projects/docs/public/images/output/new

const fs = require('fs');
const process = require('process');
const path = require('path');
const glob = require("glob")

const dir = process.argv[2];

const input_path = path.join(dir, '**', '*.png');
const output_path = path.join(dir, "min");

const sharp = require('sharp');

glob(input_path, function (err, files) {
  if (err != null) { throw err; }
  fs.mkdirSync(output_path, { recursive: true });
  files.forEach(function(inputFile) {
  sharp(inputFile)
    .jpeg({ mozjpeg: true, quality: 60, force: true })
    .toFile(path.join(output_path, path.basename(inputFile, path.extname(inputFile))+'.jpg'), (err, info) => {
      if(err === null){
          fs.unlink(inputFile, (err2) => {
              if (err2) throw err2;
              console.log('successfully compressed and deleted '+inputFile);
          });
      } else { throw err }
    });
  });
});

**注意:**此方法是破坏性的,将删除任何现有的. png。确保有一个备份您的原件。

相关问题