How to use java.awt.Image on JavaFX Part 2

前回は...

Java APIjava.awt.Image から JavaFX APIjavafx.scene.image.Image に変換して JavaFX で表示する
方法でしたが、今回は その逆...
JavaFX APIjavafx.scene.image.Image を java.awt.Image に変換して Java API で利用する方法です。

これも前回同様とっても簡単です。
JavaFX であらかじめ用意されている 以下の API (ドキュメントには載ってないですが...) を利用するだけです。

var fxImage = javafx.scene.image.Image {
    url: "..."
}
var image = fxImage.platformImage as java.awt.Image;

ただ一つポイントが...
Image#platformImage 属性は Object 型のインスタンスです。
これは、プラットフォームによりインスタンスの型が異なるからのようです。
デスクトップ 環境の場合は java.awt.Image (java.awt.image.BufferedImage) のインスタンスが取得できます。
モバイル 環境の場合、取得できるインスタンスjava.awt.Image ではないようです。
もちろん、今回はデスクトップ 環境を前提としていますので、安易にキャストしています。

と言うことで...
実際に、これを利用して『Drag and Drop on JavaFX Part 6 (FileDroppable)』 の サンプルを少し改良してみました。

 ※ ローカルファイルにアクセスするので、セキュリティの警告がでます。

改良点は...

サムネイルを ローカルストレージに保存しておいて、次回の起動時に表示する。
です。コードはこんな感じ...

var storage = Storage { source: "thumbnail_01" }

var resource = storage.resource;
resource.maxLength = 1 * 1024 * 1024;

var os = resource.openOutputStream(true);
try {
    // サムネイル 出力 (今回は JPEG 固定)
    ImageIO.write(image.platformImage as BufferedImage, "JPEG", os);
} finally {
    os.close();
}
ある事情により、今回のサンプルは上記のコードよりもう少し面倒なことをしていますが、その話はまたの機会に...
ローカルストレージの保存ファイルを見てみたら、その謎がわかるかも...