LoginSignup
1
0

More than 3 years have passed since last update.

Node.jsで画像ファイルのExif情報を削除する

Posted at

TL;DR

gmパッケージを使いNode.jsで画像ファイルのExif情報を削除する方法を紹介します。

サンプルとして2パターンの使い方を示します。

  • ローカルの画像ファイルを処理する
  • ブラウザからアップロードした画像をNest.js(Typescript)で受け取り処理する

セットアップ

gmパッケージを使います。他、GraphicsMagickとImageMagickにも依存するので別途インストールしておきます。

検証環境

macOS v.10.15.4

$ node -v
v12.16.1

$ npm -v
6.13.4

$ brew info graphicsmagick
graphicsmagick: stable 1.3.35 (bottled), HEAD

$ brew info imagemagick
imagemagick: stable 7.0.10-27 (bottled), HEAD

サンプルコード

a. ローカルの画像ファイルを処理する

基本的な使い方です。

const gm = require('gm');

gm.subClass({
    imageMagick: true
});

gm(__dirname + '/image.jpg')
    .autoOrient()   // exifから回転方向を設定しておく
    .noProfile()    // exifを削除
    .write(__dirname + '/image_after.jpg', async err => {
        if (err) {
            console.error(err);
            return;
        }
    });

b. ブラウザからアップロードした画像をNest.jsで受け取る(Typescript)

Nest.jsのセットアップなどは割愛します。

画像ファイルのアップロード

  • 選択したファイルをFormDataに詰めてfetchで送信します
  • "my-images"の部分は任意で、サーバーサイドでも同じ文字列を使用します
<label>
  画像を選択
  <input id="input-files" type="file" multiple />
</label>
<input id="input-upload" type="button" value="アップロード" />
<script>
  const inputFiles = document.querySelector('#input-files');
  document
    .querySelector('#input-upload')
    .addEventListener('click', event => {
      formData = new FormData();
      for (let i = 0; i < inputFiles.files.length; i++) {
        formData.append('my-images', inputFiles.files[i]);
      }

      fetch(`/upload`, {
        method: 'POST',
        body: formData,
      });
    });
</script>

サーバーサイド

import {
  Controller,
  Get,
  Post,
  UploadedFiles,
  UseInterceptors,
} from '@nestjs/common';
import { FilesInterceptor } from '@nestjs/platform-express';
import { AppService } from './app.service';
import * as gm from 'gm';
gm.subClass({ imageMagick: true });

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Post('/upload')
  @UseInterceptors(FilesInterceptor('my-images'))
  async upload(@UploadedFiles() files: any[]) {
    for (let i = 0; i < files.length; i++) {
      const filePath = __dirname + '/' + files[i].originalname;
      gm(files[i].buffer)
        .autoOrient()
        .noProfile()
        .write(filePath, err => {
          if (err) {
            console.error(err);
            return;
          }
        });
    }
  }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0