FileMaker で参照ファイルのサムネイルを作りたい

FileMaker Pro で画像データベースを作る際、画像を参照で登録するとサムネイルを生成できません。でもサムネイルを作りたい。どうしましょう。こうしました。

参照で登録した画像のサムネイルを作りたい

小ネタです。

GetThumnbnail()

GetThumnbnail() という関数があります。オブジェクトフィールドを指定すればサムネイルを作成してくれます。

しかしこの関数、内部または内部に準じる格納フォルダに画像を登録しているときのみ機能して、そうでない場合、つまり参照で登録したときには機能しません。

参照画像ではサムネイルを作ってくれないことを知らなくて「なぜサムネイルを作ってくれないんだろう」とかなり四苦八苦していましたがもともと出来ないようでした。

参照登録でデータベースを作りたいし、サムネイルも必要なんです。何とかサムネイルを生成する方法ないでしょうか。

よくわからない

GetThumbnail関数のフィールドを指定する箇所にパスを書いてみたりしましたが当然動くはずもなく、それ以外にもあれやこれやと試行錯誤を続けましたが省略します。すべて失敗したからです。

で、なんとか無理矢理にでもできないものかと考えて、無理矢理にそれをやってしまうわけです。

その前に、そもそもサムネイルが必要かどうかをちょっと考えます。

ちょっとしたことならサムネイルなしでもあまり困らない

リスト表示するときや画像そのものを大きく表示する必要がないとき、レイアウト上にサムネイルを配置したいわけですが、これに関しては参照画像を小さいフィールドで表示するだけで事足ります。もともと参照しているだけですから、小さく表示すれば小さいなりのキャッシュで表示が済んでしまう(と、思われる)からです。

サムネイルを作らなくても大した問題はないってことですね。しかしそうもいかないことだってあります。

タイル表示をするときにはサムネイルが必要

どうしてもサムネイルが必要なのはタイル表示をしたいときです。

FileMakerでは基本タイル表示はできません。でも無理矢理ならできます

→サムネイルのタイルビュー

タイル表示の際には、サムネイルの小さな画像を base64 エンコードでテキスト化します。そのために元になる小さなサムネイル画像が必ず必要になります。サムネイル、やっぱ要るじゃん。

無理矢理サムネイルを作る

参照でサムネイルを作る方法、そんな方法はありませんが、じゃあ参照じゃなく読み込んでしまえばいいのでは。そうですね、読み込めばサムネイルを作れます。

無理矢理とはこのことです。参照でサムネイルを作れないなら読み込むしかありません。

FileMakerのスクリプトは発想がアナログチックで、それは実際に手順として行うことを記述して再現するような考え方です。行き詰まったとき、大抵は原始的で野蛮な解決方法で乗り切れます。次のようなスクリプトを作って自動で動かせばいいです。

  1. 参照している画像を読み込む
  2. サムネイルを作成する
  3. 作成できたら読み込んだ画像を捨てる

もうちょっと詳細に書くとこうなります。

画像を読み込む

まず参照で読み込んでいるメインのフィールドには手を付けず、サムネイルを作るためだけの仮のイメージフィールドをひとつこしらえます。これはグローバルフィールドで良いでしょう。ファイルの中でただひとつあれば事足ります。

すでに参照で登録しているから画像にはパスがあります。そのパスを指定して画像を仮イメージフィールドに挿入します。

thumbnailを作る

GetThumbnail()でサムネイルを作成します。サムネイルの保存場所は別途設定しておけばいいですね。なんならbase64も作成します。計算式フィールドになるでしょうから、画像を読み込んだ瞬間にもうサムネは出来上がっています。

捨てる

最後に、仮フィールドを空にして読み込んだ画像を削除します。

はい。以上です。それだけのことでした。ループで処理すればだだだだーっとサムネイル作成作業もすぐに終わります。

最初に参照にて画像を読み込む段階でスクリプトに混ぜ込み、登録と同時、あるいは登録直後に処理してしまえばいいでしょう。

参照で読み込んだイメージのサムネイルを作成する方法でした。

オマケ システマチックなフィールド

あまりにも簡単に終わったのでオマケの話題です。特に読む必要はありません。

読み込んだ画像のパス

読み込んだ画像を格納するフォルダを指定する事で、決まったフォルダ内に画像が収集されます。参照とどう違うんだいと言いたい感じもしますが違うみたいです。

管理 オブジェクト
管理 > オブジェクト…
フィールドオプション
フィールドオプション

「読み込んだ」扱いとなり、GetAsTextでパスを取得しようにも、デフォルトのディレクトリ以下、即ちファイル名しか取得できません。これではいけませんので、無理矢理パスを取得します。

格納フォルダまでのパスを手書きしてもいいし、ファイルと同じ階層にあるなら Get(ファイルパス)を利用して整形してもいいでしょう。格納フォルダまでのパスをグローバルなフィールドに作っておくことをお勧めします。

格納フォルダまでのパス & ファイル名 でパスが完成します。パスを用意しておけば何かと使えます。

システムドライブ 計算 グローバル Get(システムドライブ)
オブジェクトパス テキスト グローバル
FM_FilePath 計算 グローバル Substitute ( Get (ファイルパス) ; Get(ファイル名) & ".fmp12" ; "")

Mac用

FileMakerのパスはややこしいです。先頭に「file:」だの「image:」だの「file」だの「filemac」だのいろんな言葉がごちゃごちゃにくっついてきます。また、「/」だったり「//」だったりもします。このわけのわからないFileMakerのパスを、Macで利用するためにPOSIX に変換してやる必要があります。

聞くところによりますとパスの書式を変換する関数が v19 で搭載されたらしいのですが未確認です。羨ましいですね。

v19を持っていないのでFileMakerのパスをPOSIXに変換する計算式をカスタム関数に保存しています。

If ( PatternCount ( field_filepath ; Get ( システムドライブ ) ) ; 
Substitute ( field_filepath ;  
 [ "image:" ; "" ] ;
 [ "movie:" ; "" ] ;
 [ "file:" ; "" ] ;
 [ "filemac:" ; "" ] ;
 [ "moviemac:" ; "" ] ;
 [ "imagemac:" ; "" ] ;
 [ Get ( システムドライブ ) ; "/" ] 
)
 ; 
Substitute ( field_filepath ;  
 [ "image:" ; "/Volumes" ] ;
 [ "movie:" ; "/Volumes" ] ;
 [ "file:/" ; "/Volumes" ] ;
 [ "filemac:" ; "/Volumes" ] ;
 [ "moviemac:" ; "/Volumes" ] ;
 [ "imagemac:" ; "/Volumes" ] 
 )
)

載せたけどダサい計算式なので話半分で眺めてね

システムドライブ上にあるのか外部ストレージなのかで処理を分けます。システムドライブの場合、ドライブ部分をごっそり省略して「/USERS/」からパスが開始するようにしています。別のコンピュータで同じファイルを開くとき、ドライブ名が異なりますからね。外部ストレージでは「/Volumes」で始まるようにします。

画像を登録するとき、FileMakerのパスとPOSIXの両方があることで、AppleScriptと組み合わせた小技などが簡単に実現できるようになります。

ということで参照でのサムネイル作成とオマケのパス話でした。