使用sharp批量转换整个图像文件夹

4

我有一个项目需要批量将大量的 .png 文件转换为 .jpg 格式,并且需要一定程度上控制压缩质量。使用 node 模块 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",但都没有成功。非常感谢您在这里提供的任何指导。

1
你提到了你尝试迭代文件但失败了。你都尝试了哪些方法?如果你发布代码,我们就可以帮助调试它。 - Robert Kawecki
这是一个公平的请求,但由于我是一个新手,而且尝试非常原始,它从来没有接近过工作 - 不幸的是,那里真的没有什么可以调试的。 - jimiayler
2个回答

4

在另一位开发者的帮助下,答案变得比我预期的更加复杂,需要使用 node 模块 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文件。请确保备份您的原始文件。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接