Node.js で Base64 の画像データを Buffer に変換して素の画像ファイルタイプ判定するメモ

Node.js で Base64 の画像データを Buffer に変換して素の画像ファイルタイプ判定するメモ

Node.js で Base64 の画像データを Buffer に変換して素の画像ファイルタイプ判定するメモです。

背景

ちょっとややこしい話です。

最近 Node-RED で行った処理ですが、いろいろと Base64 データで画像データが溜まっているけれど、そのデータの中身が PNG か JPG かを判定する必要があり、あえて Buffer データに変換し 1 バイト目の内容で PNG なのか JPG なのか画像ファイルタイプ判定しました。

実際のコード

実際のコードはこちらです。

function getFileType(base64String) {
  // プレフィックスがある場合は除去
  const cleanedBase64 = base64String.includes(",") ? base64String.split(",")[1] : base64String;
  // Node.js では Buffer を使って base64 をデコードする
  const buffer = Buffer.from(cleanedBase64, 'base64');
  const firstByte = buffer[0];

  if (firstByte === 0xFF) { // JPEGの先頭バイトは 0xFF
    return "jpg";
  } else if (firstByte === 0x89) { // PNGの先頭バイトは 0x89
    return "png";
  }
  return "unknown";
}

base64String として Base64 データが来るとして、プレフィックス自体は今回はアテにしないので、簡易的にプレフィックスがある場合は除去します。

そして Node.js では Buffer クラスを使って base64 をデコードした上で、JPEG の先頭バイトは 0xFF 、PNG の先頭バイトは 0x89 で判定するようにしています。

開発途中で JPEG 想定で Base64 やプレフィックスを作っちゃってたけど、実は PNG データや GIF データも混入してしまっていて、よくわからなくなっていたので、これで、素の画像ファイルタイプ判定ができたので助かりました。