Pic Trimmer - Java Application ▲factory top


はじめに 2021 Feb 28

そもそも本アプリを作るきっかけになった 「フィルム デジタイズ メモ」 にも書きましたが、 フィルムデジタイズの工程で結構面倒なのが有効エリアのトリミングです。

フィルムスキャナーでもデジカメ接写でも、 フィルム周囲の余白やフィルムのエッジが写り込みます。 そういった写真を数千枚トリミングするには、 自動化されていないとお手上げです。 本アプリを使うことで、 周囲の不要部分が取り除かれたきれいなトリミングを簡単に行うことが出来ます。

 

使い方

共通サイズの検出

写真のサイズは「旅行」や「イベント」などテーマ単位で同じ方が良いです。 その為に本ツールはまず、テーマ内の全写真を読み、 全体で共通なエリア(=最も小さいエリア=共通サイズ)を調べます。 事前準備としてテーマのディレクトリを切りトリミング前のファイルを入れておきます。

pic_trimmer.jar をダブルクリックしアプリを起動し、
パネルの右クリックメニューから 「Set Picture directory and Detect trim size」を選択します。

表示されたファイル選択ダイアログで、 テーマの写真が入ったディレクトりを選択します。
自動的にそのディレクトり内の全写真の有効エリアを調べます。

 

微調整とファイル出力

トリミング前の写真の有効エリアはそれぞれ微妙に異なる為、
各写真で青い枠をドラッグしエリアを微調整してから
パネルの右クリックメニューから 「Save and Next」を選択でJpeg出力し、
同じことを最後の写真まで行います。

エッジ検出
  • 同じフィルムでも接写の仕方でさまざまな大きさや映り方になります。
  • 上下左右の赤い部分はアプリが不要な余白やエッジと判断した部分です。
  • 赤い部分が切れているのは(汚れ等で)余白やエッジと判断しなかった部分です。
  • 検出はエッジから25%の部分まで行い最後に検出した位置をエッジとします。

処理の結果、写真ディクトリ内に "TRIMMED" という新しいディレクトりが切られ、
その中にトリミングされた写真ファイルが元と同じファイル名で出力されます。
元のファイルはそのまま残っているので比較確認出来ます。
↓上の元写真からトリミング処理した写真。

 

Property の説明

写真ディレクトリの選択はここでも行えます
現在選択されている写真ディレクトりです
アスペクト比を選択します 3:2, 4:3, 16:9, 1:1 が選べます
本アプリでエッジが正確に検出できない場合
あるいはエッジが傾いている場合などは
4辺にそれぞれマージンを加えて調整します
エッジ検出で同じ色と判断する際の MASK Bit (RGB) です
4辺の中ほどでエッジ検出してゆく幅です
OK:設定有効で閉、Apply:設定有効、 Close:設定破棄で閉です

尚、これらの設定は起動ディレクトりに "pt.properties" というファイル名で保存され、次回から自動的に再現されます。

version 1.2 - 撮影日付設定機能の追加 2021 May 19

フィルム時代の撮影日の記録といえば光学的な写仕込みがありました。 一方デジタル写真には撮影日時が記録されていて、いろいろと使われます。

デジタイズしてデジタル写真と同じ扱いになると、 そのままではアプリ等で見る際に撮影日が表示されなくて何かと不便です。 (あるいは30年前の写真を見ているのに、 接写した最近の日時が表示されても違和感があります) そこで撮影日付の設定が出来るようにしました。

撮影日時はメタデータ Exif (Exchangeable image file format) に記録されます。 この Exif データを直接扱うと大変なので、抽象化されたライブラリ Apache commons Imaging を使います。 具体的な使い方は、該当 GitHub にあるサンプルファイル WriteExifMetadataExample.java が参考になりました。

関連すると思われるタグは以下の3つがあり
  • TiffTagConstants.TIFF_TAG_DATE_TIME
  • ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL
  • ExifTagConstants.EXIF_TAG_DATE_TIME_DIGITIZED
前の2つに、本アプリで設定した撮影日が入ります。 3つ目は、本アプリの処理でデジタイズが完了すると考え、 その処理日時がが入ります。

アプリとしては Property に以下の赤枠の部分が追加され、 撮影日が設定できます。 撮影時刻も設定したいところですが、 昔のことで、時刻までは残っていないので諦めました。

ここに設定した年、月、日が Jpeg ファイルに記録されます

version 1.4 - 使い勝手の向上 2021 Jun 9

使っているといろいろと課題が見えてくるもので、 以下の改善を行い version 1.4 としました。

  • トリミングされたファイルが出力されるディレクトり名は "TRIMMED" を止め、 実際の使用の文脈に沿って、元の親ディレクトりと同じ名前としました。
  • 当たり前の機能ですが対応出来ていなかった縦長写真にも対応しました。
  • トリミングの微調整がマウス操作に加え、 カーソルキーでも行えるようにしました。
  • トリミング結果を確認しセーブして次の写真に移る操作は、 コンテキストメニューに加え、 リターンキーやスペースキーでも行えるようにしました。
  • アプリの終了は、コンテキストメニューに加え、 Eキーでも行えるようにしました。

課題

トリミングが簡単になったとはいえ、最後の微調整は手で行っています。 多くの場合それは人物にからむもので、 AI 認識により人物の位置が検出出来れば、 自動化できるように思えます。

 

ソースコード公開 GitHub

Java パッケージ構成
package pic_trimmer;
Main.java アプリ構成を生成、UIイベントと描画の制御
Commander.java ユーザーの操作を受け機能実行
Detector.java エッジ検出
MessageWindow.java さまざまな情報の開示
PropertyWindow.java さまざまな設定変数へのアクセス

ソースおよび実行ファイルは GitHub へ。