FileMakerにTOAST UI Image Editorを組み込む

FileMaker
FileMaker

FileMakerで画像の加工を行いたいという要望がユーザーからあり、ClarisのHPで紹介されていたTOAST UI Image EditorをFileMakerに組み込みしてみました。
ImageEditorに関する解説記事などがあまりなかったため、組み込みの流れや設定項目などをまとめてみたいと思います。

目標

  1. ImageEditorに標準搭載されている機能を全て使えるようにする。
  2. FileMakerオブジェクトフィールドからの画像取得
  3. FileMakerオブジェクトフィールドへの画像保存

サンプルファイル

サンプルファイルは下記のリンクからダウンロードできます。

FileMaker ToastUI ImageEditor

FileMaker Ver19以上が必要です。

バージョン: Ver1.0

環境

FileMaker19以上
 「WebビューアでJavascriptを実行」のスクリプトステップを使用するためVer.19以上が必要です。

オンライン環境
 CDNを使用してJavaScriptを読み込んでいるためオンライン環境が必要です。

必要なファイル

まずTOAST UI ImageEditorで使用するファイルを読み込みします。
JavascriptやCSSファイルはCDNのものを使用します。

<head>
  <link type="text/css" href="https://uicdn.toast.com/tui-color-picker/v2.2.3/tui-color-picker.css" rel="stylesheet">
  <link type="text/css" href="css/service-mobile.css" rel="stylesheet">
</head>
<body>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.6.0/fabric.js"></script>
  <script type="text/javascript" src="https://uicdn.toast.com/tui.code-snippet/v1.5.0/tui-code-snippet.min.js"></script>
  <script type="text/javascript" src="https://uicdn.toast.com/tui-color-picker/v2.2.6/tui-color-picker.js"></script>
  <script type="text/javascript" src="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.js"></script>
</body>

Javascript本体

Javascriptのコードは大きく5つのブロックに別けて記載しています。

  1. テーマの設定
  2. 言語の設定
  3. ImageEditorの設定
  4. ImageEditorからFileMakerへデータを渡す処理
  5. Canvasのリサイズ

ここからはJavaScriptのコードをカスタマイズしていくので、ブロックごとのカスタマイズポイントを説明していきます。

テーマの設定

var customTheme = {
  'common.bi.image': 'https://uicdn.toast.com/toastui/img/tui-image-editor-bi.png',
  'common.bisize.width': '251px',
  'common.bisize.height': '21px',
  'common.backgroundImage': './img/bg.png',
  'common.backgroundColor': '#fff',
  'common.border': '1px solid #c1c1c1',
  
  // load button
  //'loadButton.backgroundColor': '#fff',
  //'loadButton.border': '1px solid #ddd',
  //'loadButton.color': '#222',
  //'loadButton.fontFamily': '\'Noto Sans\', sans-serif',
  //'loadButton.fontSize': '12px',
  'loadButton.display': 'none',

  // download button
  //'downloadButton.backgroundColor': '#fdba3b',
  //'downloadButton.border': '1px solid #fdba3b',
  //'downloadButton.color': '#fff',
  //'downloadButton.fontFamily': '\'Noto Sans\', sans-serif',
  //'downloadButton.fontSize': '12px',
  'downloadButton.display': 'none',
...以下略
},

標準のUIでは右上にファイル選択とダウンロードのボタンがありますが、こちらのボタンを使用してしまうとFileMakerに保存されているデータを読み込んだり、編集後のファイルをFileMakerに保存したりすることができません。

loadButton及びdownloadButtonに対してdisplay:’none’のプロパティを設定することによりボタンを非表示にしています。

言語の設定

var locale_JP = {
  //Common 共通
  Load: "ファイル選択",
  Download: "ダウンロード",
  Apply: "適用",
  Cancel: "キャンセル",
  Range: "太さ",
  Color: "色選択",
  Reset: "初期化",
...以下略
}

メイン・サブメニューの表記を日本語化するための設定です。Keyに英語とValueに対応する日本語を記述していきます。
各メニューにカーソルを合わせると表示されるツールチップに表示される英語をそのままKeyとして設定して下さい。(大文字・小文字が区別されるため正確に書き写して下さい)

ImageEditorの設定

var imageEditor = new tui.ImageEditor('#tui-image-editor-container', {
  includeUI: {
    theme: customTheme,
    locale: locale_JP,
    loadImage: {
      path:'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
      name:'image'
    },
    initMenu: 'icon',
    menu: ['icon','text','draw','crop','rotate','flip','shape','mask','filter'],
    menuBarPosition: 'bottom'
  },
  cssMaxWidth: 700,
  cssMaxHeight: 500,
  usageStatistics: false
});
項目設定値説明
themecustomTheme上で設定したテーマの内容を読み込む
localelocale_JP上で設定した言語の内容を読み込む
loadImage : path‘data:image/gif;base64,R0lGOD〜’最初に読み込みする画像をBase64で指定
loadImage : name‘image’最初に読み込みする画像の名前を指定
initMenuiconデフォルトで選択されるメニューを指定
menu[‘icon’,’text’ … ‘filter’]表示するメニューを指定
menuBarPosition‘bottom’メニューバーの位置を指定
cssMaxWidth700最大のcanvas幅を指定
cssMaxHeight500最大のcanvas高さを指定

loadImageではbase64形式の小さな画像を読み込みしておきます。
これはAPI経由で画像を読み込んだ場合、エディターのサブメニューが正常に起動しない問題を回避するためです。

ImageEditorからFileMakerへデータを渡す処理

//––––––––––––––––––––––––––––––––––––––––
//––– FileMakerへ編集後のデータを渡す JPEG
//––––––––––––––––––––––––––––––––––––––––
function imageDownload_jpg() {
  var funcName = "tui_call_downloadImage";
  var base64image = imageEditor.toDataURL({format:"jpeg", quality:0.7});
  FileMaker.PerformScript(funcName, base64image);
}

//––––––––––––––––––––––––––––––––––––––––
//––– FileMakerへ編集後のデータを渡す PNG
//––––––––––––––––––––––––––––––––––––––––
function imageDownload_png() {
  var funcName = "tui_call_downloadImage";
  var base64image = imageEditor.toDataURL({format:"png"});
  FileMaker.PerformScript(funcName, base64image);
}

ImageEditorの標準機能では画像をブラウザからダウンロードしてしまいます。
今回はボタンを押すとFileMakerのオブジェクトフィールドに加工済の画像を保存したいので、Javascriptでその処理を作成します。

formatを指定せずにtoDataURL関数を実行すると、読み込んだ画像の拡張子に関係なくPNG形式で出力されてしまいます。それを避けるために読み込んだファイルの拡張子がJPEGかPNGかによって別の関数をFileMakerから呼び出せるように処理を分けています。

また、JPEGの場合はオプションでqualityを設定することができます。qualityを1(100%の画質)で出力するとファイルサイズがとても大きくなってしまうので、数値を変えながら出力してファイルサイズと画質のバランスを確認しながら設定してみて下さい。

Canvasのリサイズ

//––––––––––––––––––––––––––––––––––––––––
//––– 画面サイズに合わせてCanvasリサイズ
//––––––––––––––––––––––––––––––––––––––––
function editor_resize() {
  var menuBarPosition = document.querySelector('.tui-image-editor-container').className;
  var editor = document.querySelector('.tui-image-editor-size-wrap');
  var submenu = document.querySelector('.tui-image-editor-submenu');
  if (/left|right/.test(menuBarPosition)) {
    var submenu_width = submenu.offsetWidth;
    var editor_width = editor.offsetWidth - submenu_width - 40;
    var editor_height = editor.offsetHeight - 40;
  } else {
    var submenu_height = submenu.offsetHeight;
    var editor_width = editor.offsetWidth - 40;
    var editor_height = editor.offsetHeight - submenu_height - 40;
  }
  imageEditor.resizeCanvasDimension( {
    width: editor_width,
    height: editor_height,
  })
}

//––––––––––––––––––––––––––––––––––––––––
//––– ウインドウの大きさが変わったらリサイズ
//––––––––––––––––––––––––––––––––––––––––
window.onresize = function() {
  editor_resize();
}

標準ではCanvasのサイズを動的に変更することが出来ないようなので、現在の表示領域からCanvasの幅、高さを計算して再設定するための関数になります。

FileMakerのスクリプト

FileMaker側では3つのスクリプトを使用します。

  1. tui_kick_loadImage
  2. tui_kick_downloadImage
  3. tui_call_downloadImage

tui_kick_loadImage

ImageEditor用のウインドウを新規で開き、オブジェクトフィールドに格納されている画像をBase64エンコードしたデータをImageEditorへ渡します。
もし画像が読み込まれない場合はスクリプト一時停止の時間を多めに取ってお試しください。

変数を設定 [ $base64 ; 値: T01_ImageEditor::xc_before_object_base64 ]
変数を設定 [ $name ; 値: T01_ImageEditor::xc_before_fileName ]

変数を設定 [ $windowName ; 値: "Toast UI Image Editor" ]
新規ウインドウ [ スタイル: ダイアログ ; 名前: $windowName ; 使用するレイアウト: 「T01_ImageEditor_edit」 (T01_ImageEditor) ]

スクリプト一時停止/続行 [ 間隔(秒): .5 ]
Web ビューアで JavaScript を実行 [ オブジェクト名: "wv" ; 関数名: "editor_resize" ]

スクリプト一時停止/続行 [ 間隔(秒): .2 ]
Web ビューアで JavaScript を実行 [ オブジェクト名: "wv" ; 関数名: "sendImage" ; 引数: $base64, $name ]

tui_kick_downloadImage

画像の拡張子によってそれぞれ対応するJavaScriptのimageDownload関数を実行します。

If [ T01_ImageEditor::xc_before_fileExtension = "png" ]
    Web ビューアで JavaScript を実行 [ オブジェクト名: "wv" ; 関数名: "imageDownload_png" ]
Else
    Web ビューアで JavaScript を実行 [ オブジェクト名: "wv" ; 関数名: "imageDownload_jpg" ]
End If

tui_call_downloadImage

ImageEditorから受け取ったbase64のデータをデコードして指定したフィールドに格納します。

変数を設定 [ $response ; 値: Get( スクリプト引数 ) ]

変数を設定 [ $base64 ; 値: Let( [ ~data = $response; ~dataLength = Length( ~data ); ~type = "data:image/" & T01_ImageEditor::xc_before_fileExtension & ";base64,"; ~typeLength = Length( ~type ) ]; Right( ~data ; ~dataLength - ~typeLength ) ) ]
変数を設定 [ $imageFile ; 値: Base64Decode( $base64 ; T01_ImageEditor::xc_before_fileName ) ]

ウインドウを閉じる [ 現在のウインドウ ]

フィールド設定 [ T01_ImageEditor::after_object ; $imageFile ]

データのデコード処理の計算式

Let(
[

~data = $response;
~dataLength = Length( ~data );
~type = "data:image/" & T01_ImageEditor::xc_before_fileExtension & ";base64,";
~typeLength = Length( ~type )

];

Right( ~data ; ~dataLength - ~typeLength )

)
タイトルとURLをコピーしました