5000164 is here

Scala で JavaFX の Casvas の内容を画像として保存する

Published 2018.1.15 by 菅原 浩

昨日の記事 の続きのようなもの。
Canvas で表示できるようになったから画像として保存する。
コードはこんな感じ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
val c = new Canvas(300, 300)
val gc = c.getGraphicsContext2D
gc.setFill(Color.GRAY)
gc.setFont(Font.font("Hiragino Sans", 20))
gc.fillText("テキスト", 50, 50)

val wi = new WritableImage(300, 300)
c.snapshot(null, wi)
val ri = SwingFXUtils.fromFXImage(wi, null)
val f = new File("test.png")
ImageIO.write(ri, "png", f)

val root = new StackPane()
root.getChildren.add(c)
val scene = new Scene(root, 350, 350)
primaryStage.setTitle("test")
primaryStage.setScene(scene)
primaryStage.show()

これを実行するとこういう画像ファイルが生成される。

生成された画像

ざっくり説明

Canvas の内容を WritableImage に変換する。
これが Canvas が持ってる snapshot というメソッドでできるっぽい。
その後は RenderedImage に変換してファイルに保存する。

参考

ついでに保存場所選択

下記のコードを追加することで保存する場所を選べるようになった。

1
2
val fc = new FileChooser
val f = fc.showSaveDialog(primaryStage)