バーr……blog のようなもの 2024 年 08 月

08 月 12 日 ( 月 )

JPEG 画像にフレームを加えるアプリの作成

JPEG 画像にフレームをつける iPhone 用の Liit というアプリが去年くらいから人気がある。デジカメの出力を下のようにしちゃうアプリだ。

これを見て、あぁこれいいな、自分もやりたいな、と思ったのだけど自分は Android ユーザ。当時そんなアプリはなかった。なお今なら Sukashi - EXIF Watermark App なんてアプリもあるので、機能やフォントに満足できるなら Android ユーザにはいいかも。

でも自分は基本的にパソコンユーザー。画像の処理はなるべくパソコンでやりたい派。だけどこういったことを簡単にやってくれるソフトは今のところ残念ながら存在しない。Liit は当然パソコンでは動かないので万事お手上げと言いたいところだけど、無いなら作るかと欲しい気持ちのほうが勝って生まれたのが addframe というシェルスクリプトだった。

「だった」と書いた。そう過去形だ。実はもう github 上のリポジトリはばっさりと消してしまった。なぜ消したのかというとシェルスクリプトなので動作する環境が非常に限られてしまう。世界でもっとも利用されている Windows ではそのままでは動かない。

それともう一つの都合が Go で書き直したコード一式を addframe という名前のリポジトリに起きたかったからだ。GitHub では同一名称で複数の異なるリポジトリを置くことはできない。シェルスクリプト版と go でリライトした版のリポジトリを addframe という同じ名前のリポジトリにすることはできない。実はこっちの理由のほうがシェルスクリプト版を亡きものにすることになった。

最初は go-addframe という名称でリポジトリを作ったのだけど、これだと go install でローカルにインストールすると、実行ファイル名がリポジトリの go-addframe になってしまうことがわかった。

あとでファイル名を addframe に変えてしまえばいいのだけれど、go install でどこにプログラムがインストールされるのかわからない人も多いと容易に想像できた。Go でプログラムを書いてる人間でないと go install でプログラムがどこにインストールされるのかなんて普通は知らない。

なので go install でインストールしたときにプログラム名は addframe でなければならなかった。そのためにはリポジトリ名は addframe でなければならない。Go 版の addframe があればシェルスクリプト版はどう考えてもお役御免になる。シェルスクリプト版のリポジトリを消さない理由はなかった。

そもそもなぜ addframe を Go で書き直したのかという話になるが、シェルスクリプトだと Linux もしくは bash をサポートする Mac でしか動かない。Mac で動くとは言っても、もしかするとスクリプトにかなり手を入れる必要があった可能性もある。なによりシェルスクリプトだとユーザが一番多い Windows で動かすのはエンジニアかよほどのパソコンマニアでもないとけっこう大変だ。

最初は Docker コンテナを作ってそこに環境を構築するという方法もやってみた。が、エンジニアでもないマニアでもない普通の人に BIOS の設定を変えてもらって Docker をインストールしてもらうの?と考えたらコンテナを簡便に作成する仕組みを作ってはみたものの、Docker のインストールの時点で挫折されそうである。なのでこれもない、となった。

そんな状況の中で、スクリプトの書き換えに過ぎないが、Go で書き直したらコンパイルさえすれば Ubuntu だろうが Mac だろうが Windows でさえも普通に動くんじゃね?Go ならそれができるやん、と気がついてしまった。

というわけで Go での再実装を行った。

概ねバグ取りとテストも終了し、撮って出し JPEG 画像に対しては当初の想定仕様通りに動いている。また当初の課題であった iPhone の HEIC 画像に対しても想定仕様通りに動いていて問題なさそうである。

プログラムは github で公開しており Ubuntu と Windows 10 で動作することは確認している。

あと Pixel や iPhone などのスマホでは通常 copyright 情報は画像ファイルに記録されない。なのでそのままでは addframe を使うと copyright 情報のところには "-" だけが寂しくプリントされる。

やはりPixel や iPhone で撮ったものでも「これはワシが撮ったんやでぇー」と copyright 情報が出るようにしたい。画像ファイルに copyright 情報がないのなら書き込めば良いということで作ったのが addcopyright というプログラムだ。

この addcopyright と addframe があれば、上のようなフレーム付き画像ができてしまうのだ。実際に Pixel 5 で撮った画像はそうやって作った。PENTAX KP の場合はカメラの設定でそうしていればカメラが画像データに copyright 情報を埋め込むのでその場合は addcopyright は必要ない。

PENTAX KP の撮影者と著作権者の設定画面
PENTAX KP の撮影者と著作権者の設定画面

そしてこれら 2 つのプログラムを Go で書き直したことで大きなメリットが生まれた。USB スティックに実行ファイルと設定ファイルを入れてしまえば、パソコンのハードディスクを一切汚染することなく USB スティック内の画像ファイルをフレーム付きにできてしまうのだ。

旅先で Windows パソコンが使えたりするなら、現地のパソコンのハードディスクにアクセスすることなく、こんな画像が作れてしまう (実際には仮想メモリーのページングでハードディスクアクセスはあるだろうけど Windows 自体の仕組みなのでそれはどうしようもない)。チョー便利!!

また設定ファイルでフォントやフォントの色、フレームの色を変更もできる。ただし現在は他のパラメータを変更すると、一部ハードコードされている設定と矛盾が生じてしまい画像が破綻する可能性があるので、変更するのは以下にとどめておいて欲しい。というか下のパラメーターはほぼ全て手を加えないといけないはずだ。

近々旅行を予定しているのだけれど、ぶっちゃけそのために Go で作り直したと言っても過言ではない。実際に USB スティックメモリーに環境を作ってちゃんと動くことを確認済みだ。あとは宿のパソコンでデジカメ画像にフレームをつけるだけなのだ。

あくまで参考例に過ぎないが自分の USB スティックメモリーに作った環境を以下に書いてこの項を締めたい。

D:¥images
 ┣ ¥dest	: フレーム追加後画像ファイル格納場所
 ┣ ¥exiftool	: exiftool
 ┣ ¥font	: フォントファイル (otf もしくは ttf)
 ┣ ¥im	: ポータブル版 ImageMagick
 ┣ ¥org	: オリジナル画像ファイル
 ┣ ¥src	: フレーム追加前画像ファイル
 ┗ ¥work	: 作業用ファイル (addcopyright 出力先)
			

images 直下に addcopyright.exe、addframe.exe のプログラム本体、addcopyright.json、addframe.json の設定ファイルを置いている。また src ディレクトリの JPEG ファイルすべてを一気にフレームをつけて dest ディレクトリに書き込む convframe.bat というバッチファイルも置いている。このバッチファイルは上の図の環境でないと動作しないので今のところ公開はしていない。