@toriyama/exif-ts
v0.0.6
Published
Exif tool
Downloads
6
Readme
This is pre-release!
@toriyama/exif-ts
JPEG 画像に含まれる Exif 情報を取り出したり編集したりするツールです。
Installation
npm install @toriyama/exif-ts
Usage
使い方の大まかな流れは次のようになります。
- ローカル/Web 上から画像を読み込み
- タグ情報を抽出
- タグ情報を編集
- 編集した画像を保存
Load image
画像を読み込みExif
オブジェクトを作成しましょう。
Exif
コンストラクタはUint8Array
を引数に取ります。
fs
fs.readFile
を用いて画像ファイルを読み込む際は、Buffer
が返るので、new Uint8Array()
によって 8 ビット符号なし整数値配列に変換してください。
import fs from "fs/promises";
import { Exif } from "@toriyama/exif-ts";
(async () => {
const buffer = await fs.readFile("/home/torichan/Pictures/roadbike.jpg");
const exif = new Exif(new Uint8Array(buffer));
console.log(exif.tags);
})();
axios
axios
を用いる場合はArrayBuffer
が返るので同様にUint8Array
に変換する必要があります。
import axios from "axios";
import { Exif } from "@toriyama/exif-ts";
(async () => {
const url =
"https://yuukitoriyama.github.io/yorimichi-images/20210711/IMG_20210711_1607115.jpg";
const response = await axios.get(url, {
responseType: "arraybuffer",
});
const buffer = new Uint8Array(response.data);
const exif = new Exif(new Uint8Array(buffer));
console.log(exif.tags);
})();
以下ではExif
オブジェクト付属のメソッド/プロパティについて解説します。
Locate marker
JPEG 画像(もとい Exif 画像)ではメタデータを保存するために種々のマーカーが定義されています。
Exif.locate
はバイナリ中のマーカーの位置を調べるためのメソッドです。
const position = exif.locate(0xffd8); // SOI(Start of Image)の位置を調べる
console.log(position); // 0
Show exif tags
Exif.tags
プロパティにはバイナリを解析して抽出された Exif 情報が保存されています。
console.log(exif.tags);
{
IFD0: [
{ tag: 272, format: [Object], value: 'QCAM-AA\x00' },
{ tag: 305, format: [Object], value: 'imx378-1\x00' },
{ tag: 306, format: [Object], value: '2021:07:11 16:07:11\x00' },
{ tag: 531, format: [Object], value: [Array] },
{ tag: 34665, format: [Object], value: [Array] },
{ tag: 296, format: [Object], value: [Array] },
{ tag: 34853, format: [Object], value: [Array] },
{ tag: 282, format: [Object], value: [Array] },
{ tag: 283, format: [Object], value: [Array] },
{ tag: 271, format: [Object], value: 'QCOM-AA\x00' }
],
IFD1: [
{ tag: 513, format: [Object], value: [Array] },
{ tag: 514, format: [Object], value: [Array] }
],
ExifSubIFD: [
{ tag: 34855, format: [Object], value: [Array] },
{ tag: 34850, format: [Object], value: [Array] },
{ tag: 33437, format: [Object], value: [Array] },
{ tag: 33434, format: [Object], value: [Array] },
{ tag: 41495, format: [Object], value: [Array] },
{ tag: 37522, format: [Object], value: '271369\x00' },
{ tag: 37521, format: [Object], value: '271369\x00' },
{ tag: 37520, format: [Object], value: '271369\x00' },
{ tag: 37386, format: [Object], value: [Array] },
{ tag: 37385, format: [Object], value: [Array] },
{ tag: 37383, format: [Object], value: [Array] },
{ tag: 41990, format: [Object], value: [Array] },
{ tag: 37510, format: [Object], value: [Uint8Array] },
{ tag: 40965, format: [Object], value: [Array] },
{ tag: 41989, format: [Object], value: [Array] },
{ tag: 36868, format: [Object], value: '2021:07:11 16:07:11\x00' },
{ tag: 37380, format: [Object], value: [Array] },
{ tag: 40963, format: [Object], value: [Array] },
{ tag: 41987, format: [Object], value: [Array] },
{ tag: 36867, format: [Object], value: '2021:07:11 16:07:11\x00' },
{ tag: 37379, format: [Object], value: [Array] },
{ tag: 40962, format: [Object], value: [Array] },
{ tag: 41986, format: [Object], value: [Array] },
{ tag: 37378, format: [Object], value: [Array] },
{ tag: 37121, format: [Object], value: [Uint8Array] },
{ tag: 40961, format: [Object], value: [Array] },
{ tag: 41729, format: [Object], value: [Uint8Array] },
{ tag: 37377, format: [Object], value: [Array] },
{ tag: 41985, format: [Object], value: [Array] },
{ tag: 36864, format: [Object], value: [Uint8Array] },
{ tag: 40960, format: [Object], value: [Uint8Array] }
],
GPSIFD: [
{ tag: 1, format: [Object], value: 'N\x00\x00\x00' },
{ tag: 2, format: [Object], value: [Array] },
{ tag: 3, format: [Object], value: 'E\x00\x00\x00' },
{ tag: 4, format: [Object], value: [Array] },
{ tag: 5, format: [Object], value: [Array] },
{ tag: 6, format: [Object], value: [Array] },
{ tag: 7, format: [Object], value: [Array] },
{ tag: 27, format: [Object], value: 'ASCII\x00\x00\x00FUSED\x00' },
{ tag: 29, format: [Object], value: '2021:07:11\x00' }
]
}