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;
}
});
}
}
}