Node.js 图片转换为 Base64 编码

概览

需要把图片转换为 Base64 编码,基于 Node.js 设计了这样一个脚本,它可以处理单文件,也可以递归处理多级目录。

我们希望可以在控制台输入命令实现图片的转码,并最终保存转码好的文件到一个同名文件中。

依赖包

包名 备注 必须
chalk 控制台彩色输出
commander 控制台命令操作
mime-types 获取文件的 mimeType
mkdirp 递归创建目录及其子目录

最终实现

#!/usr/bin/env node
/**
 * 图片转 base64
 * @example $ node img2base64.js [file|dir]
 */
const fs = require('fs');
const path = require('path');
const mimeType = require('mime-types');
const program = require('commander'); // 命令行工具
const chalk = require('chalk'); // 带色彩的控制台输出
const mkdirp = require('mkdirp');

// 实例化 program
program.version('0.0.1')
  .parse(process.argv); // 格式化参数

// 读取图片文件转换为 base64 编码,并打印到控制台
function parse(file) {
  let filePath = path.resolve(file); // 原始文件地址
  let fileName = filePath.split('\\').slice(-1)[0].split('.'); // 提取文件名
  let fileMimeType = mimeType.lookup(filePath); // 获取文件的 memeType

  // 如果不是图片文件,则退出
  if (!fileMimeType.toString().includes('image')) {
    console.log(chalk.red(`Failed! ${filePath}:\tNot image file!`));
    return;
  }

  // 读取文件数据
  let data = fs.readFileSync(filePath);
  data = new Buffer(data).toString('base64');

  // 转换为 data:image/jpeg;base64,***** 格式的字符串
  let base64 = 'data:' + fileMimeType + ';base64,' + data;

  // 创建输出目录
  let outPath = path.resolve('./base64/');
  let outFileName = `${fileName.join('-')}.txt`;
  let outFile = path.join(outPath, outFileName);
  if (fs.existsSync(outPath)) {
    saveData(base64, outFile, filePath, outFileName);
  } else {
    mkdirp(outPath, () => {
      saveData(base64, outFile, filePath, outFileName);
    });
  }
}

// 写入到文件
function saveData(data, file, filePath, outFileName) {
  fs.createWriteStream(file)
    .end(data, () => {
      console.log(chalk.green(`Success! ${filePath}:\t${outFileName}`));
    });
}

// 遍历目录下的文件并逐个转换为 base64
function dirEach(dir) {
  let pa = fs.readdirSync(dir);

  pa.forEach((item, index) => {
    let itemPath = path.resolve(dir + '/' + item);
    let stat = fs.statSync(itemPath);
    if (stat.isDirectory()) {
      dirEach(itemPath); // 递归
    } else {
      parse(itemPath); // 转换为 base64
    }
  });
}

// 获取输入的文件地址或目录地址
let input = program.args[0];
const MSG_ERROR_INPUT_EMPTY = 'File or filePath cann not be empty!';
const MSG_WARN_OPTION_EMPTY = 'No option';
if (!input) return console.error(new Error(MSG_ERROR_INPUT_EMPTY));

// 读取文件
fs.stat(input, (err, stats) => {
  // 如果是文件则直接解析
  if (stats.isFile()) return parse(input);

  // 如果是目录则遍历目录下的图片文件并逐个进行解析
  if (stats.isDirectory()) return dirEach(input);

  // 无对应操作
  console.log(MSG_WARN_OPTION_EMPTY);
});

执行效果:


命令执行效果

生成的文本文件

你可能感兴趣的:(Node.js 图片转换为 Base64 编码)