FileMaker Pro で画像を扱う際、参照で登録するとサムネイルを生成できないことがあります。でもサムネイルを作りたい。どうしましょう。こうしました。
その前に、良い機会なのでサムネイルについておさらいします。
サムネイル
GetThumnbnail()
GetThumnbnail() という関数があります。オブジェクトフィールドとサイズを指定すれば小さい画像を作成してくれます(オブジェクトのタイプに準じるようです)
GetThumbnail( オブジェクトフィールド ; 100 ; 100 )
このように書いてサムネイルを作成しますね。フィールドの後ろは縦横サイズ最大値で、100は100pxってことです。100px以内でサムネイルが作られます。元の画像より大きなサイズは作りません。また、縦横比率は維持されます。正方形にくり抜いてくれる機能はありません。
サムネイルフィールドの目的
小さなサムネイルを作る目的はなんでしょう。負荷を抑えるのためですね。アイコン付きのリスト表示などにも気軽に使えます。
タイルビューを行う場合にbase64エンコードする元画像として必要です。→ サムネイル画像のタイルビューを作った
その他、動画のサムネイルを自作するときのフィールドとしても使います。 → かんたん動画サムネイル
サムネイルと言っても小さいとは限らない
サムネイルと言っても小さいとは限らず、プレビュー表示用という位置付けで割と大きなサイズを指定するのも有りかと思います。登録データが TIFF や PSD など大きく重い画像であった場合は役に立ちませんが(勘違いしていましたが、サムネイルは画像タイプを変換しません)
エクスポート用
「フィールド内容のエクスポート」で書き出すときに、画像サイズが揃っているのも何かと便利でしょう。目的に沿った書き出し専用サイズのサムネイルフィールドを作っておくと実践的ですね。
レコードごとに自由なサイズのサムネイルを必要とするときは、例えば数値用フィールドを用意しておいて、GetThumbnail のサイズにそのフィールドを指定しておくといいでしょう。
そんなこんなで、メディア管理システムを作るにあたっては複数のサイズ別GetThumbnailフィールドを用意しておくのは有効と思います。
参照で登録した画像のサムネイルを作りたい
ということで本題に入ります。
GetThumnbnail() が機能しない
とっても便利な GetThumbnail 関数ですが、参照で登録したときにはサムネイルを作ってくれず機能しません。。。。と、思っていたら機能するときもありますね。はて?まあ何しろ参照のときサムネイルを作ってくれない事があります(言い方を柔らかくしました)
参照でサムネイルを作ってくれない(場合もある)ことを知らなくて「なぜサムネイルを作ってくれないんだろう」とかなり四苦八苦していましたがもともと出来ないようでした。
参照登録でデータベースを作りたいし、サムネイルも必要なんです。生成する方法ないでしょうか。
GetThumbnail関数のフィールドを指定する箇所にパスを書いてみたりしましたが当然動くはずもなく、それ以外にもあれやこれやと試行錯誤を続けましたが省略します。すべて失敗したからです。
で、なんとか無理矢理にでもできないものかと考えて、無理矢理にそれをやってしまうわけです。
無理矢理サムネイルを作る
参照でサムネイルを作る方法、そんな方法はありませんが、じゃあ参照じゃなく読み込んでしまえばいいのでは。そうですね、読み込めばサムネイルを作れます。
無理矢理とはこのことです。参照でサムネイルを作れないなら読み込むしかありません。
FileMakerのスクリプトは発想がアナログチックで、それは実際に手順として行うことを記述して再現するような考え方です。行き詰まったとき、大抵は原始的で野蛮な解決方法で乗り切れます。次のようなスクリプトを作って自動で動かせばいいです。
- 参照している画像を読み込む
- サムネイルを作成する
- 作成できたら読み込んだ画像を捨てる
もうちょっと詳細に書くとこうなります。
一時オブジェクトフィールドを利用する
画像を読み込む
まず参照で読み込んでいるメインのフィールドには手を付けず、サムネイルを作るためだけの一時的なイメージフィールドをひとつこしらえます。これはグローバルフィールドで良いでしょう。ファイルの中でただひとつあれば事足ります。
すでに参照で登録しているから画像にはパスがあります。そのパスを指定して画像を仮イメージフィールドに挿入します。
thumbnailを作る
GetThumbnail()でサムネイルを作成します。サムネイルの保存場所は別途設定しておけばいいですね。なんならbase64も作成します。計算式フィールドになるでしょうから、画像を読み込んだ瞬間にもうサムネは出来上がっています。
捨てる
最後に、仮フィールドを空にして読み込んだ画像を削除します。
はい。以上です。それだけのことでした。ループで処理すればだだだだーっとサムネイル作成作業もすぐに終わります。
最初に参照にて画像を読み込む段階でスクリプトに混ぜ込み、登録と同時、あるいは登録直後に処理してしまえばいいでしょう。
参照で読み込んだイメージのサムネイルを作成する方法でした。