2024年5月30日木曜日

表に保存したTIFF画像を表示する

表に保存されているTIFF画像を表示する方法を考えてみました。一般的なブラウザ(Apple Safariを除く)はTIFF画像に対応していません


テストに使用するアプリケーションを作成します。

クイックSQLの以下のモデルから表TEST_IMAGESを作成します。
# prefix: test
images
    name    vc40 /nn
    content file
レビューおよび実行をクリックし、表の作成まで作業を進めます。


表が作成されたらアプリケーションの作成をクリックし、アプリケーションを自動生成します。


TEST_IMAGESフォーム付き対話モード・レポートのページが、作成されるアプリケーションに含まれています。

アプリケーションの名前TIFF Imageとします。

アプリケーションの作成を実行します。


アプリケーションが作成されます。

ページ・デザイナで、ページ番号の対話モード・レポートのページを開きます。

CONTENTを選択し、タイプイメージの表示に変更します。BLOB属性MIMEタイプ列CONTENT_MIMETYPEファイル名列CONTENT_FILENAME最終更新列CONTENT_LASTUPDを選択します。


対話モード・レポートを選択し、プロパティ・エディタの属性タブを開きます。

パフォーマンス遅延ロードオンにします。この後に動的アクションを作成しますが、タイミングとしてリフレッシュ後を選択します。遅延ロードオンにしていないと、ページ・ロード時にレポートの表示が遅延ロードにはならないため、リフレッシュ後のイベントが発生しません。

変更を保存します。


ページ・デザイナでページ番号のフォームのページを開きます。

ページ・アイテムP3_CONTENTを選択し、ストレージMIMEタイプ列CONTENT_MIMETYPEファイル名列CONTENT_FILENAME文字セット列CONTENT_CHARSETBLOB最終更新列CONTENT_LASTUPDを設定します。

変更を保存します。


以上で画像のアップロードと表示を行う、簡単なアプリケーションが作成できました。

表示される画像が画面に収まるように制限するため、ページ・プロパティのCSSインラインに以下を記述します。
img {
    width: 80%;
}

アプリケーションを実行し、画像の対話モード・レポートのページを開きます。

作成をクリックし、画像をアップロードします。


最初はJPEGの画像をアップロードしてみます。


アップロードした画像が表示されます。


画像をTIFF画像に入れ替えると、その画像は表示されません。


TIFF画像をサポートしているSafariであれば、画像が表示されます。


Safariでいいじゃん、とはならないため、Chromeなどでも表示されるように機能を追加します。

今回はUTIF.jsを使って、ブラウザ上でTIFF画像を表示できる形式に変換します。GitHub上の以下のリンクより、UTIF.jsをダウンロードします。



共有コンポーネント静的アプリケーション・ファイルを開きます。


ファイルの作成を実行します。


コンテンツに先ほどダウンロードしたUTIF.jsを選択し、作成をクリックします。


静的アプリケーション・ファイルとしてUTIF.jsが作成されます。

この時点ではまだミニファイされたファイルが作成されていないため、変更の保存をクリックします。


変更を保存するとミニファイされたファイルが作成されますが、参照がミニファイルされたファイルを指していません。一旦ページをリロードすると、参照がミニファイされたファイルを指すようになります。

#APP_FILES#UTIF#MIN#.js

これをクリップボードにコピーしておきます。


静的アプリケーション・ファイルの準備は以上です。

ページ・デザイナでページ番号の対話モード・レポートのページを開きます。

ページ・プロパティJavaScriptファイルURLに、先ほどの静的アプリケーション・ファイルUTIF.jsへの参照を設定します。

#APP_FILES#UTIF#MIN#.js


対話モード・レポートに動的アクションを作成します。

識別名前リフレッシュ後とします。タイミングイベントリフレッシュ後選択タイプリージョンは、対象としている対話モード・レポートを指定します。


TRUEアクションとしてJavaScriptコードの実行を選択し、設定コードに以下を記述します。



以上でアプリケーションは完成です。

TIFF画像の変換はレポートに含まれるすべてのIMG要素を対象としているため、TIFF以外の場合はエラーが発生します。querySelectorAllでの選択条件を調整してTIFF画像に限定する必要があります。

セレクタの指定を簡単にするためには、列CONTENTタイプイメージの表示を使う代わりに、対話モード・レポートのソースであるSELECT文でAPEX_UTIL.GET_BLOB_FILE_SRCを呼び出すようにすると、IMG要素にCONTENT_MIMETYPEに応じた属性を付加することができます。

今回の記事は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。