画像取り込みプログラムはちゃんと動くようになって、完成したと思っていたのだが、それについての投稿をしようとした時点で、思わぬ問題(の可能性)が見つかって、あと少しの状態である。それが、MusicBeeからgmusicbrowserへの移行に気を取られて中断しているのだが、現時点での話を書く。

当初から希望していた取り込み手順は、以下のとおり。

  1. カメラやスマフォをPCに接続すると自動認識されて、取り込みウインドウが出る。
  2. ウインドウには、前回以降に撮影された画像だけが表示される。
  3. 取り込みボタンで、それらを取り込める。
  4. 取り込んだ画像は、画像の撮影年月日の名前のディレクトリ(例: "2016/2016_10_21")に格納される。
  5. 取り込んだファイルの最終更新日時は、撮影日時になる。

絶対に落とせない点は以下のとおり。

  • 取り込んだ画像は、カメラに残す。(間違ってPCで消してしまっても、カメラのストレージがフルになって消さない限り、オリジナルが復活可能なので)
  • それでも、前回取り込んだ画像は再度取り込むことはない。(自分で取り込む画像を1枚ずつ選択するのは論外)
  • 取り込んだ画像は、画像の撮影日の名前のディレクトリ(例: "2016/2016_10_21")に入る。
  • 取り込んだ画像の最終更新日時は撮影日時になる。(EXIFの情報でも十分なのだが、最終更新日時を使うとPNGも同じ扱いができるので、便利)

もちろん、それらを実現できる既存のプログラムを探したのだが、なかった。特に、「前回取り込んだ画像は再度取り込むことはない」と「画像の撮影日の名前のフォルダに入る」と「最終更新日時が撮影日時になる」をすべて実現できるものはなかった。

それで、作ることにした。もちろん、全部自分で作ったわけではなく、主要なところは以下の既存のソフトを使った。

  • gphoto2 : カメラからの画像取り込み
  • exiftool : 画像ファイルの処理 (撮影日時の抽出など)

これだけ書けば十分ではあるが、ちょっと苦労・工夫した点を書く。

gphoto2には新しい(取り込んでいない)画像だけを取り込むオプション(--new)があるが、効かない場合がある(例: iPhone)ので、それは使わずに、自分で実装した。取り込み済みファイル一覧を保存しておいて、取り込みのたびに、カメラ内の画像一覧と比較して、新しいものだけを取り込むようにした。

なお、ファイル一覧のサイズが大きくなり過ぎることを心配したが、現在のところ問題なさそうだ。1000-2000枚(正確な数は数えていない)の一覧ではサイズは100KB未満である。

この時、複数のカメラを持っている場合、画像ファイル名(例: "IMG_0123.JPG")が重複する可能性があるので、カメラの製品名とシリアル番号からカメラの識別記号を生成して(シリアル番号をそのまま出すのは嫌だし長くなるので、CRC32でダイジェスト値を生成した。例: "1234567890")、カメラ別にファイル一覧を保存するようにした。

gphoto2は取り込んだ画像の保存先を指定できないようなので、撮影日の名前のフォルダに移す処理は、exiftoolを使って自分で作った。exiftoolは、移す先に同じ名前のファイルがあるとエラーになって中断するので、同じ名前のファイルがあった場合の処理を追加した。

この時、上述のとおり、別のカメラとのファイル名の重複の可能性があるので、ファイル名にカメラの識別記号を追加するようにした(例: "IMG_0123.JPG" → "IMG_0123_1234567890.JPG")。

それから、デジカメでは問題ないが、スマフォ(例: Android)からは関係のないファイルが一覧に来ることがあるので、取り込むファイルの種類(MIMEタイプ)を指定して、フィルタリングするようにした。

更に、Nexus 4はファイル名が長過ぎてgphoto2のファイル一覧のフォーマットが崩れてしまうことがあるうえに、画素数が入っていないことがあるので、それへの対応も追加した。

ここまでは、(GUI関係を除いて)10/16にできたのだが、その後、問題(の可能性)に気付いてしまった。カメラを長く使って、撮影した画像が1万枚以上になると、ファイル名が最初に戻るのである(例: "IMG_9999.JPG"の次は"IMG_0001.JPG")。親ディレクトリが異なっているから区別可能なのだが、一覧を取り込んだ際に親ディレクトリを無視してしまうので、特に、取り込み済みファイル一覧で重複してしまう。

それに対応するため、いくつかの案を考えた。

  1. 親ディレクトリ名もカメラ識別記号の生成要素にする。
  2. 保存するファイル名に撮影日時を追加する。
  3. 保存するファイル名に親ディレクトリ名(の一部)を追加する(例: "100")。
  4. 取り込み済みのファイル名と重複していたら、ファイル名に通し番号を追加する。

今は案1と3が有望である。が、かなり長く使っているCanonのデジカメですら、まだ番号は3000番台で急ぐ必要がないので、なかなかやる気が出ずに居る。忘れて使っているうちに、「あれ? 取り込めない?」とか思って慌てるパターンかも知れないw 時間が経つと、既存のデータ構造を変更するのが大変になるので、早目に手を打った方がいいのではあるが。。。

PS. 前の投稿の画像は、このプログラムを使って取り込んだ。

  •   0
  •   0

コメントを書く

名前    

メール 

URL