画像に文字を重ね貼りするコマンドライン処理（ImageMagickでテキストイメージ生成＋合成）

# TL;DR

* ImageMagickだけで，画像に文字を重ね張りする仕組みを作ります
* 連続した複数の画像の隅に，数字（ページ番号など）を合成します

<img src="https://qiita-image-store.s3.amazonaws.com/0/309617/4a7bae75-291a-7bd7-a560-05f1b82a1aef.png" width=20%> + <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/87ca3414-f70b-2077-25f3-97440d71d3cc.jpeg" width=20%> = <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/674616c4-ae56-c0d9-23d3-d243454fced0.jpeg" width=20%>

# 手順概要

* 文字列が画像になっている，背景色が透明のテキストイメージを作ります
* 対象画像（文字を書き込みたい画像）に，テキストイメージを合成します
* 上記の2手順を，連番のファイルに対して実施します

写真は[フリー素材ぱくたそ](https://www.pakutaso.com/)さんから，[何か用ですか？（猫）](https://www.pakutaso.com/20181050285post-17963.html)をお借りしました．

# 各手順の実施に必要な部品

## 画像の情報を得る

* 画像の形式，サイズ，カラー情報は，```identify```コマンドで得ることができます

```
$ identify TOMcatDSC02022_TP_V4.jpg
TOMcatDSC02022_TP_V4.jpg JPEG 800x450 800x450+0+0 8-bit sRGB 76326B 0.000u 0:00.000
m
```

## 単色の画像を作る

* 800x450ピクセルの，背景色が透明な単色画像 transparent.jpg を作ります
* 青（#0000FF）の単色画像 blue.jpg を作ります

```bash
convert -size 800x450 xc:none transparent.jpg # 背景色が透過の画像を作る
convert -size 800x450 xc:"#0000FF" blue.jpg   # 背景色が青の画像を作る
```

| Option | 説明 |
|------|---|
| -size | 画像サイズ( 縦 x 横 ) |
| xc:"#0000FF" | 画像（背景）色をカラーコードで指定(例は青色．透明色の場合はnoneにする) |
| *.jpg | 出力画像名(jpg, png) |

* 作られる画像
    * <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/b6b60096-d840-ee02-f14e-4d51d732baf5.jpeg" width=50%>


## テキストイメージ（文字が書き込まれた画像）を作るコマンド

* 前項の単色画像を作るコマンドにオプションを加えて，テキストイメージを作ります
* 800x450ピクセルの画像で，テキストイメージを作ります
* 背景が透過色の場合は，png形式のファイルで出力してください(jpgだとnone指定だと黒色になる)

```
convert -font Helvetica -size 800x450 \
  -fill "#FFFFFF" \
  -background "#000000" \
  -pointsize 80 \
  caption:"textImage" \
  textImage.png
```

| Option | 説明 |
|------|------|
| -size | 画像サイズ( 縦 x 横 ) |
| -font Helvetica | フォントの指定（convert -list fontで確認できる） |
| -fill "#FFFFFF" | 文字色のカラーコード |
| -background "#000000" | 背景色のカラーコード(none使用可能，透過の場合はpngファイルで出力してください) |
| -pointsize 80 | フォントサイズ(単位はpt) |
| caption:"textImage" | |
| textImage.png | 出力画像名(jpg, png) |

* 作られる画像
    * <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/401c080c-83f3-0a97-a09d-96753dd2c8d1.jpeg" width=50%>

## 2枚の画像を合成する

* 透過背景色のテキストイメージと，テキストイメージを貼り付けたい画像を合成します
    * ```convert``` は日本語の文字を含んでいないようなので，fontオプションで，フォントファイルを指定します
    * コマンド例はMacOS OSX10.13.6 の場合です

```
# 透過テキストイメージ(背景色透明なのでpng)の作成
convert convert -font "/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc" \
  -size 800x450 \
  -fill "#FFFFFF" \
  -background none \
  -pointsize 80 \
  caption:"何か用ですか？" \
  textImage.png
# 画像の合成
composite -compose over \
  ./textImage.png \
  ./TOMcatDSC02022_TP_V4.jpg \
  output.jpg
```

* ```composite```コマンドのオプションの概要は以下のとおりです．

| Option | 説明 |
|------|------|
| -compose | 重ね合わせの方法(overなど) |
| textImage.png | 背景色透過のテキストイメージ(重ねる方の画像) |
| TOMcatDSC02022_TP_V4.jpg | 猫の画像(重ねられる方の画像) |
| output.jpg | 出力画像 |

* 作られる画像
    * <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/674616c4-ae56-c0d9-23d3-d243454fced0.jpeg" width=50%>

# Putting Together

* 前項までのコマンドを，シェルスクリプトでループ実行します

```
# (必要であれば)テスト用画像の生成
for i in `seq -w 1 100`
do
convert -size 800x450 xc:"#0000FF" blue${i}.jpg
done
```

* blue1.jpgからblue100.jpgまでの画像についてテキストを書き込みます

```
# テキストイメージを生成して画像に重ね合わせ
for i in `seq -w 1 100`
do
    convert -font "/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc" \
      -size 800x450 \
      -fill "#FFFFFF" \
      -background none \
      -pointsize 80 \
      caption:$i \
      textImage.png
    composite  -compose over \
      ./textImage.png \
      ./blue${i}.jpg \
      output${i}.jpg
    rm -f textImage.png
done
```

* 作られる画像たち
    * ```convert -delay 10 -loop 0 output*.jpg movie.gif``` でアニメーションGIFを作りました
    * <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/f7d3c8da-287f-d854-8959-dd973fff6957.gif" width=50%>

# 参考

* [PAKUTASO](https://www.pakutaso.com/)
* [imagemagickの使いかた日本語マニュアル よく使われるオプション](http://imagemagick.rulez.jp/archives/639)
* [アニメーションGIFの作り方 ImageMagick編](http://www.protein.osaka-u.ac.jp/rcsfp/supracryst/suzuki/jpxtal/Katsutani/gif1.php)