nodejs 压缩图片-支持jpg和png

2021/5/28 1:00:25图片处理nodejs

1,安装依赖

yarn add imagemin imagemin-jpegtran imagemin-pngquant

2,代码示例 minImage.mjs (关于mjs)

import imagemin from 'imagemin'
import imageminJpegtran from 'imagemin-jpegtran'
import imageminPngquant from 'imagemin-pngquant'

// 单个文件压缩 
const files = await imagemin(['./input.png'], {
  destination: './output.png',
  plugins: [
    imageminJpegtran(),
    imageminPngquant({
      quality: [0.6, 0.8]
    })
  ]
})

// 多文件压缩,图片多了会短暂卡死。
const files = await imagemin(['inputdir/*.{jpg,png}'], {
  destination: 'images/outputdir',
  plugins: [
    imageminJpegtran(),
    imageminPngquant({
      quality: [0.6, 0.8]
    })
  ]
})

// files 
//=> [{data: <Buffer 89 50 4e …>, sourcePath: './input.png', destinationPath: './output.png'}, …]

Tips:批量压缩时,会大量消耗内存,并假死。所以尽量选择逐个压缩的方式。
为了批量压缩,可以使用递归方式批量处理。

minImage.mjs

import fs from 'fs'
import imagemin from 'imagemin'
import imageminJpegtran from 'imagemin-jpegtran'
import imageminPngquant from 'imagemin-pngquant'

const pictures = readDirSync('./inputdir/')
const outputdir= './outputdir/'

await min(0)
console.log('全部完成')

// 递归压缩图片
async function min(index) {
  const item = pictures[index]
  if (!item) {
    return
  }
  await imagemin([item], {
    destination: outputdir,
    plugins: [
      imageminJpegtran(),
      imageminPngquant({
        quality: [0.6, 0.8]
      })
    ]
  });
  if (index < pictures.length - 2) {
    index++
    await min(index)
  }
}

// 读取目录中的所有文件路径
function readDirSync(path, list) {
    if (!fs.existsSync(path)) {
        return list
    }
    const pa = fs.readdirSync(path);
    pa.forEach(function (ele) {
        const fullPath = PATH.join(path, ele)
        const info = fs.statSync(fullPath)
        if (info.isDirectory()) {
            readDirSync(fullPath, list);
        } else {
            list.push(fullPath)
        }
    })
    return list
}