【FileMaker】PowerShell連携で画像回転とExif情報を削除

目次

経緯

画像も簡単に入力ができる商品管理的なデータベースが欲しいという要望があり、ファイルメーカーでサンプル的に作りました。しかし、横向きの画像がどうしても縦になると依頼主はすでに100件以上登録済みで、そのほとんどが縦向きになっており困った様子。

原因はカメラにあるようで、何の機種かわかりませんが恐らくスマホで、横向きで撮影してもEXIF情報に登録された向きが90度横になるみたいで、Windows上の表示は横向きなのですが、ファイルメーカーのオブジェクトフィールにピクチャ挿入してみるとEXIF情報通り90度横に表示されてしまいます。

解決方法として「縮小専用」などのフリーソフトでリサイズするついでにEXIF情報を削除する方法が思いついたので、縮小専用でリサイズした画像を挿入したところ横向きで登録できました。EXIF情報を削除すれば解決できることが分かったのですが、依頼主にその方法を提案しましたが、100以上ある画像を変換して再登録するのは嫌だとのこと...。

他に思いつく解決策はファイルメーカー内で画像操作を行うプラグインを使うことですが、すぐに試すことができなかったり、高額だったり、バージョンが古くて対応していなかったりと現実味に欠けており、どれもピンときませんでした。

目についたプラグイン

プラグイン不要でPowerShellと連携できる方法があった

以下のサイトがヒントだったのですが、Windows上で動いているFileMakerであればスクリプトからPowerShellにコマンドを送信し、PowerShell上で画像の回転、EXIF情報の削除を行うことができることを発見しました。ちなみに、環境はWindows11とFileMaker12です。

 

ただ、上記サイトのまま使用してもPowerShellに値を渡せなかったり、スクリプト内で画像のエクスポート・インポートがうまくいきませんでした。これはそれぞれでパスの書き方が原因で、以下のように改造したらうまくいきました。

スクリプトとソース

スクリプトの流れとしては以下の通りです。

  1. フィールド内の画像をフォルダに書き出す
  2. 書き出し先のファイルパスを変数に入れてPowerShellに渡す
  3. PowerShellで該当のパスの画像を右90度回転&EXIF削除して上書き保存
  4. ファイルメーカーでピクチャを挿入

ファイルメーカーのスクリプト

スクリプトの編集画面
変数を設定 [$pathExport; 値:Get(テンポラリパス) & 〇〇管理::写真01]
フィールド内容のエクスポート[〇〇管理::写真01];「$pathExport」]
変数を設定 [$pathWin; 値:Replace ( Substitute ( $path ; "/" ; "\\" ) ; 1 ; 1 ; "" )]
Eventを送信[「aevt」;「odoc」;Let([    $ps =     "powershell -windowstyle hidden -Command \"     [void][Reflection.Assembly]::LoadWithPartialName('System.Drawing');
    $PathWin = '{pathWin}';    $image = [System.Drawing.Image]::FromFile($pathWin);
    $image.RotateFlip('Rotate90FlipNone');    foreach ($propertyId in $image.PropertyIdList) {        $image.RemovePropertyItem($propertyId);    }    $image.Save($pathWin, System.Drawing.Imaging.ImageFormat]::Jpeg);    $image.Dispose();    \""]; Substitute($ps; "{pathWin}"; $pathWin))]
スクリプト一時停止/続行[間隔(秒:3)]
変数を設定 [$pathInport; 値:"imagewin:" & $pathExport]
フィールドへ移動 [〇〇管理::写真01]
ピクチャを挿入 [「$pathInport」]

「Eventを送信」の部分で設定する計算式の指定の内容

Eventを送信の計算式の指定
Let([
    $ps = 
    "powershell -windowstyle hidden -Command \" 
    [void][Reflection.Assembly]::LoadWithPartialName('System.Drawing');
    $PathWin = '{pathWin}';
    $image = [System.Drawing.Image]::FromFile($pathWin);

    $image.RotateFlip('Rotate90FlipNone');
    foreach ($propertyId in $image.PropertyIdList) {
        $image.RemovePropertyItem($propertyId);
    }
    $image.Save($pathWin, [System.Drawing.Imaging.ImageFormat]::Jpeg);
    $image.Dispose();
    \""
]; 
Substitute($ps; "{pathWin}"; $pathWin)
)

画像の回転に関するPowerShellのコマンドは以下のページが参考になりました。

 

削除するEXIF情報について

上記のスクリプトでは画像ファイルのEXIF情報をすべて削除します。「向き(Orientation)」に関する情報のみをEXIFから削除することもできます。

EXIF情報を削除する部分

foreach ($propertyId in $image.PropertyIdList) {
    $image.RemovePropertyItem($propertyId);
}

EXIFから向きの情報のみを削除する場合

上記の部分を以下に置き換えればOKです。これでもうまくいきました。

$image.RemovePropertyItem(274)

EXIFに含まれるタグの種類は以下のページが参考になります。向きの情報である「Orientation」のタグ番号は16進数の0x0112であり、10進数に変換すると274になります。

 

まとめ

ファイルメーカーからPowerShellにコマンドを送信したり、変数の受け渡しができることを初めて知りました。また、PowerShellで画像の編集ができることも知りませんでした。解決不可能と思っていたことが無事に解決できて良かったです。

前へ

【JS】ブラウザの表示領域を縦横比を計算