exiftoolを使って画像のIPTC情報をcsvでまとめて設定する

# まとめ

[exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/)を使って、IPTC情報ほかを記述したcsvファイルを読み込むことで画像ファイルのメタデータを設定できる。

同一項目に複数の内容を設定する場合は、以下の条件で設定できた。

* 設定したい項目をダブルクオートで囲い ``` "tag1<CR+LF>tag1<CR+LF>tag2" ``` のように一件ごとにCR+LFで区切って記述する
    * Excelのセル内改行を行った状態でCSV形式で出力すると、この区切りがLFとなるため期待された動作とはならない。[RFC4180(Common Format and MIME Type for Comma-Separated Values (CSV) Files)](https://www.ietf.org/rfc/rfc4180.txt)に従い、レコードの区切りとなる改行コードと複数データの区切り文字のコードのいずれもCR+LFにそろえる、あるいはLFにそろえることで正しく区切り文字として認識される。

記述例：改行はすべてCR+LF

```
SourceFile,IPTC:Keywords
0361.JPG,"竹富島
桟橋
青い空"

```

# 準備
## 目的
* 複数の画像ファイルをflickrに掲載したい
* タグ、タイトルなどメタデータを一点一点入力するのは面倒なのであらかじめexcelなどで作成したものをインポートしたい

## 対象のデータ
* 画像ファイルが1万枚以上ある
* 画像のメタデータはexcelであらかじめ作成済み

## 実行環境
* Windows7のコマンドプロンプト
* [exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/)のWindows用バイナリ
    * 解凍後、実行ファイルの名前を exiftool(-1).exe から exiftool.exeに変更
    * パスが通っている場所に exiftool.exeを移動
    
# 手順
## csvファイルの準備
   * 改行コード(レコードの区切り)は CR+LF に設定
   * exiftoolを実行してファイル名など基本的なメタデータを取り出す。
      * ここでの出力ファイル名は metadata.csv 
      * 画像ファイルは同じディレクトリに3件ある
      * -g オプションでタグ付きのメタデータで出力される。
      * 参考：コマンドラインオプション > http://www.sno.phy.queensu.ca/~phil/exiftool/exiftool_pod.html#Input-output-text-formatting

```
C:\Users\tzhaya\Pictures\test>exiftool -g -csv . > metadata.csv
    1 directories scanned
    3 image files read

C:\Users\tzhaya\Pictures\test>
```

* metadata.csvの先頭行にファイル名、あとは元のファイルに記録されていたEXIF情報が出力される。
  * 各タグ名と内容の詳細は[ExifTool Tag Name](http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/index.html)を参照されたい。

## csvファイルの編集
* ここでは、flickrに必要なIPTCタグの情報のみを編集する。IPTCタグとflickrのフィールドの対照は[setting flickr metadata using IPTC information](http://cheshrkat.blogspot.jp/2008/01/setting-flickr-metadata-using-iptc.html)による。今回は以下を設定した。

| IPTC Field|Flickr Field |
|:----------|:------------|
|Caption-Abstract|Description|	 
|Headline|Title|
|Keywords|Tags|
※Descriptionに相当するタグはCaptionではなくCaption-Abstractの模様。

* excelでの入力時には、IPTCのフィールドには先頭に IPTC: と付与する。また、CSVでの保存後に以下の処理が必要。
    * タグを複数使用する場合は、セル内で改行しておく。
    * テキストエディタでタグの区切りで使用している文字コード LF を CR+LF に変換する
    * 文字コードをUTF-8に変換する

## exiftoolでの反映

4. 入力したcsvファイルの内容をexiftoolで画像ファイルに反映させる
    * -csv=metadata.csv でインポートするファイル名の指定
    * -codedcharacterset=utf8 -charset iptc=latin2 で内部の文字コードをUTF-8に変換するよう指定。これがないと日本語が表示されない

```
C:\Users\tzhaya\Pictures\test>exiftool -csv=metadata.csv -codedcharacterset=utf8 -charset iptc=latin2 .
    1 directories scanned
    3 image files updated

C:\Users\tzhaya\Pictures\test>
```
5. flickrにドラッグアンドドロップでインポート

![image](https://qiita-image-store.s3.amazonaws.com/0/151928/98dbafb2-6625-adac-779f-8c05fc5c58f5.png)

~~# 問題点
* うまくインポートできているように見えたが、複数のKeywordsをカンマ等で区切っても1ワードとしてみられてしまうようだ。
* IPTC:KeywordsとXMP:Subjectに1ワードずつ入力すると、flickr側で合計2語のtagとして扱ってくれるが、3語以上はどうすればいいのか。未解決。~~

# 追記
その後、twitterで以下のコメントを頂いたので試してみた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/tzhaya">@tzhaya</a> こんばんは。<br>Windowsのエクスプローラで、画像のプロパティ→詳細でタグの項目を手で入力すると、複数の項目は ;（セミコロン）で区切られます。これをflickerにアップロードすると複数のTagが入るので、; で区切るようにしたらいかがでしょう。</p>&mdash; おかもと (@Araiyayon) <a href="https://twitter.com/Araiyayon/status/855007102418300929">2017年4月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### Windowsのエクスプローラの画像プロパティで各タグを手入力

![image](https://qiita-image-store.s3.amazonaws.com/0/151928/d37bd2a8-ac1b-4a26-810d-04e9f2f7d197.png)

この状態でflickrにインポートすると、タグは3つ設定される。

### csvにエクスポート

```
C:\Users\tzhaya\Pictures\test>exiftool -g -csv 0361.JPG > 0361.csv
```

### メタデータ項目と内容の対照

| tag| |
|:----------|:------------|
|SourceFile|0361.JPG|
|EXIF:ImageDescription|竹富島の桟橋|
|EXIF:Artist|tzhaya|
|EXIF:DateTimeOriginal|1999:04:20 20:37:16|
|EXIF:CreateDate|1999:04:20 20:37:16|
|EXIF:XPTitle|竹富島の桟橋|
|EXIF:XPAuthor|tzhaya|
|EXIF:XPKeywords|竹富島;桟橋;青空|
|IPTC:Keywords|竹富島, 桟橋, 青空|
|XMP:Subject|竹富島, 桟橋, 青空|
|XMP:Title|竹富島の桟橋|
|XMP:Description|竹富島の桟橋|
|XMP:Creator|tzhaya|
|XMP:LastKeywordXMP|竹富島, 桟橋, 青空|
|XMP:DateAcquired|2010:04:20 20:37:39.276|
|Composite:SubSecCreateDate|1999:04:20 20:37:16.17|
|Composite:SubSecDateTimeOriginal|1999:04:20 20:37:16.17|

タグはEXIF:XPKeywords,IPTC:Keywords,XMP:Subject,XMP:LastKeywordXMPの3カ所に入力されていることがわかる。

### CSVからのflickrへのインポート

まずメタデータを全て削除する。

```
C:\Users\tzhaya\Pictures\test>exiftool -all= 0361.jpg
    1 image files updated
```

ここで
EXIF:XPKeywords
IPTC:Keywords
XMP:Subject
の3つの形式それぞれでインポートを試してみた。結果は以下の通り。

| tag| csvファイルの記述 | flickrでのインポート内容 |
|:----------|:------------|:------------|
|EXIF:XPKeywords|竹富島;桟橋;青空|インポートされず|
|IPTC:Keywords|竹富島;桟橋;青空|竹富島;桟橋;青空が一つのタグになる|
|XMP:Subject|"竹富島, 桟橋, 青空"|竹富島,桟橋,青空が一つのタグになる|

なお、先に出力した 0361.csv をもう一度 0361.jpg に書き込んでも、区切り記号は反映されずまとめて一つのタグと見なされてしまった。ううむ。

# jsonでインポートしてみた

ではjsonで書いてみた。

```
[{
  "Title": "竹富島の桟橋",
  "Subject": ["竹富島","桟橋","青空"],
}]
```

そしてファイルに書き込んでflickrにインポート。今度はタグが3つ付いた。


```
C:\Users\tzhaya\Pictures\test>exiftool -json=test.json 0361_json.jpg
    1 image files updated
```

# 追記2

さらに おかもと (@Araiyayon)さんからコメントを頂いたので、追試してみた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/tzhaya">@tzhaya</a> そちらと同じようなcsvで試したら、うまくアップロードできました。何が違うのかな？<br>flickr <a href="https://t.co/NOsP0cL0V4">https://t.co/NOsP0cL0V4</a><br>original <a href="https://t.co/cgmDxEUIqN">https://t.co/cgmDxEUIqN</a><br>(originalの画像をエディタで開くと、LFの改行がみえます)</p>&mdash; おかもと (@Araiyayon) <a href="https://twitter.com/Araiyayon/status/855612913180069888">2017年4月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

CSVファイル自体のレコードの区切るとなるコードの問題と考え、CR+LF から LF に変更してexiftoolで読み込ませて動作を確認した。
なお、[RFC4180(Common Format and MIME Type for Comma-Separated Values (CSV) Files)](https://www.ietf.org/rfc/rfc4180.txt)に従い、レコードの区切り文字、データの区切り文字のコードをいずれもCR+LFで試したが動作した。

* レコードの区切りの文字コードは CR+LF
* 設定したい項目をダブルクオートで囲い ``` "tag1<LF>tag1<LF>tag2" ``` のように一件ごとにCR+LFで区切って記述する

CSVファイルの記述

```
SourceFile,IPTC:Keywords
0361.JPG,"竹富島
桟橋
青い空"

```

```
C:\Users\tzhaya\Pictures\test>exiftool -csv=0361_iptc_col_lf.csv -codedcharacterset=utf8 -charset iptc=latin2 0361_iptc.jpg
    1 image files updated

```

Windowsでの画像のプロパティは以下のように見える。

![image](https://qiita-image-store.s3.amazonaws.com/0/151928/601f5de9-fc92-aeb6-e4ad-c7b18c619db0.png)

これをflickrにドラッグアンドドロップでインポートしたところ、正しくtagが3つ設定された。

![image](https://qiita-image-store.s3.amazonaws.com/0/151928/38eb128d-ff35-7ffe-9f8c-7646616e62d3.png)