使用tinypng写一个简单的批量压缩图片程序

1,793 阅读2分钟

缘起:

tinypng网站的在线压缩图片一次只能上传20张图片,且每张最大5M; 当我们遇到需要压缩大于20张图片的时候我们可以调用其提供的api, 来实现批量压缩图片。每月前500张是免费的。

image.png 我们写一个简单的程序来实现调用其api来实现批量压缩图片;

1. 创建一个工作目录并初始化项目

执行mkdir tinyCompressImg && cd tinyCompressImg && npm init -y image.png

2.新建images目录用来存放需要压缩的图片,新建compress_images目录用来存放压缩后的图片

目录结构如下:
mkdir images compress_images

image.png

3.安装tinify和colors-console, tinify是tinyPng提供的模块,colors-console让控制台的console打印变得有色彩

yarn add tinify colors-console

image.png

4.tinypng官网申请使用key

key申请地址 tinypng.com/developers

image.png 输入用户名和邮箱地址,验证通过后即可获取key。点击查看账户可以查看每月使用情况,每月压缩前500张图片免费。

image.png

5.目录下新建index.js,引入node fs模块和path模块

完整代码如下

const { statSync, readdirSync, readFileSync, writeFile } = require("fs");
const { resolve } = require("path");

const colors = require("colors-console");
const tinify = require("tinify");

tinify.key = "123testKey"; // tinyPng申请的key值,这里请替换成申请的真实可用,文章中为假,非真实

// 需要压缩的图片目录
const DIR_NAME = resolve(__dirname, "images");
// 图片压缩后存放的目录
const COMPRESS_DIR_NAME = resolve(__dirname, "compress_images");

const compress = (path, newFilePath) => {
  const files = readdirSync(path); // 读取原有文件目录
  console.log(files);
  if (files.length) {
    files.map((item) => {
      let filePath = resolve(path, item); // 文件、文件夹地址
      let newPath = resolve(newFilePath, item); // 处理保存到目录后的地址
      let stats = statSync(filePath); // 获取处理时文件或文件夹的描述信息
      if (stats.isDirectory()) {
        // 文件夹
        console.group(colors("cyan", `文件夹${item}信息`));
        console.log(colors("cyan", `当前访问到为文件夹,原始地址为:${filePath}`));
        console.log(colors("cyan", `存储为新的地址为:${newPath}`));
        console.groupEnd();
      } else if (stats.isFile()) {
        console.group(colors("blue", `文件${item}信息`));
        console.log(colors("blue", `当前为单文件,原始地址为:${filePath}`));
        console.groupEnd();
        let itemSplit = item.split(".");
        let fileType = itemSplit[1];
        if (fileType !== "jpg" && fileType !== "png" && fileType !== "jpeg") {
          // 非图片
          console.log(colors("res", `当前文件格式为${fileType}`));
          return;
        }
        // 图片进行上传压缩,转存文件
        const sourceData = readFileSync(filePath);
        tinify.fromBuffer(sourceData).toBuffer((err, resultData) => {
          if (err) throw err;
          writeFile(newPath, resultData, (err) => {
            if (err) throw err;
            console.log(colors("yellow", `图片压缩成功:${newPath}`));
          });
        });
      }
    });
  } else {
    console.log(colors("red", `当前目录无文件`));
  }
};

compress(DIR_NAME, COMPRESS_DIR_NAME);

6.test

在images目录下放置几张需要压缩的图片

image.png 在终端执行index.js node index.js

image.png 查看压缩结果

image.png

607kb → 212kb
434kb → 35.kb
17.1kb → 12.4kb

终: tingPng提供的api更多使用文档tinypng.com/developers/…