JavaFX 2.2 Canvas and Snapshot Test
JavaFX 2.2の新機能であるCanvasとWritableImageを使って簡単なテストをしてみます。
1 まずCanvasにブルーの四角形とファイル名がa.pngという名前の画像を読み込みます。
canvas = new Canvas(737,785); gc = canvas.getGraphicsContext2D(); gc.setFill(Color.BLUE); gc.fillRect(10,10,70,70); img = new Image(JavaFX_CanvasTest.class.getResourceAsStream("a.png")); // 幅272 高さ320の画像を読み込み(85,85)から同じ大きさで表示します gc.drawImage( img, 0, 0, 272, 320 ,85, 85, 272, 320);
2 次にFileメニューからOpenで適当な画像を読み込みます。
ファイルの読み込みと表示処理
openMenuItem.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { FileChooser fc = getFileChooser(); Stage stage2 = new Stage(); File file = fc.showOpenDialog(stage2); if (file != null) { Image img2 = new Image(file.toURI().toString()); gc.drawImage(img2, 0, 0, 380, 380 ,357, 405, 380, 380); } } } );
3 FileメニューのSceneCapture又はCanvasCaptureで画面をキャプチャーします。
ファイル名に.pngという拡張子を付けるとPNGで保存します。
public void capture2(String target) { Stage stage3 = new Stage(); FileChooser fc = getFileChooser(); fileName = fc.showSaveDialog(stage3); extension = returnExtension(); System.out.println("Extension = " + extension); switch (target) { case "scene": wimg2 = scene.snapshot(null); break; case "canvas": SnapshotParameters params = new SnapshotParameters(); params.setFill(Color.ALICEBLUE); wimg2 = canvas.snapshot(params, null); break; default: break; } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //Code to change Swing data. try{ ImageIO.write(SwingFXUtils.fromFXImage(wimg2, null), extension, fileName); }catch(java.io.IOException ioe){ System.out.println(ioe); } } }); } public String returnExtension() { String lowerCaseName = (fileName.toString()).toLowerCase(); if(lowerCaseName.endsWith(".jpg")) { return "jpg"; }else if( lowerCaseName.endsWith(".jpeg") ){ return "jpg"; }else if(lowerCaseName.endsWith(".gif") ){ return "gif"; }else if( lowerCaseName.endsWith(".png")) { return "png"; }else{ return "png"; } }
SceneをCaptureした画像
CanvasをCaptureした画像
最初に読み込む画像a.pngはJavaFX_CanvasTest.javaと同じフォルダ内に置いてください。
JavaFX_CanvasTest.javaのコード全てです。
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.Group; import javafx.scene.SnapshotParameters; import javafx.scene.paint.Color; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; import javafx.scene.control.MenuBar; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; import javafx.embed.swing.SwingFXUtils; import javafx.scene.image.WritableImage; import javafx.stage.FileChooser; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javax.imageio.ImageIO; import java.io.File; import javax.swing.SwingUtilities; public class JavaFX_CanvasTest extends Application { private FileChooser fileChooser ; private GraphicsContext gc; private MenuBar menuBar; private Scene scene; private Canvas canvas; private File fileName; private WritableImage wimg2; private String extension; private Image img; @Override public void start(final Stage stage) { System.out.println("javafx.version = " + System.getProperty("javafx.version")); String[] formatNames = ImageIO.getReaderFormatNames(); System.out.println("ReaderFormatNames:"); for(int i = 0; i < formatNames.length; i++) { System.out.println(formatNames[i]); } formatNames = ImageIO.getWriterFormatNames(); System.out.println("WriterFormatNames:"); for(int i = 0; i < formatNames.length; i++) { System.out.println(formatNames[i]); } Group root = new Group(); scene = new Scene(root, 737, 785, Color.web("#000066", 0.5)); canvas = new Canvas(737,785); gc = canvas.getGraphicsContext2D(); gc.setFill(Color.BLUE); gc.fillRect(10,10,70,70); img = new Image(JavaFX_CanvasTest.class.getResourceAsStream("a.png")); gc.drawImage( img, 0, 0, 272, 320 ,85, 85, 272, 320); root.getChildren().add(canvas); createMenu(); root.getChildren().add(menuBar); stage.setScene(scene); stage.show(); } public void createMenu(){ final Menu menu1 = new Menu("File"); menuBar = new MenuBar(); menuBar.setUseSystemMenuBar(true); menuBar.getMenus().add(menu1); MenuItem openMenuItem = new MenuItem("Open"); MenuItem scene_CaptureMenuItem = new MenuItem("Scene Capture"); MenuItem canvas_CaptureMenuItem = new MenuItem("Canvas Capture"); menu1.getItems().add(openMenuItem); menu1.getItems().add(scene_CaptureMenuItem); menu1.getItems().add(canvas_CaptureMenuItem); openMenuItem.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { FileChooser fc = getFileChooser(); Stage stage2 = new Stage(); File file = fc.showOpenDialog(stage2); if (file != null) { Image img2 = new Image(file.toURI().toString()); gc.drawImage(img2, 0, 0, 380, 380 ,357, 405, 380, 380); } } } ); scene_CaptureMenuItem.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { capture2("scene"); }}); canvas_CaptureMenuItem.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { capture2("canvas"); }}); } public void capture2(String target) { Stage stage3 = new Stage(); FileChooser fc = getFileChooser(); fileName = fc.showSaveDialog(stage3); extension = returnExtension(); System.out.println("Extension = " + extension); switch (target) { case "scene": wimg2 = scene.snapshot(null); break; case "canvas": SnapshotParameters params = new SnapshotParameters(); params.setFill(Color.ALICEBLUE); wimg2 = canvas.snapshot(params, null); break; default: break; } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //Code to change Swing data. try{ ImageIO.write(SwingFXUtils.fromFXImage(wimg2, null), extension, fileName); }catch(java.io.IOException ioe){ System.out.println(ioe); } } }); } public String returnExtension() { String lowerCaseName = (fileName.toString()).toLowerCase(); if(lowerCaseName.endsWith(".jpg")) { return "jpg"; }else if( lowerCaseName.endsWith(".jpeg") ){ return "jpg"; }else if(lowerCaseName.endsWith(".gif") ){ return "gif"; }else if( lowerCaseName.endsWith(".png")) { return "png"; }else{ return "png"; } } protected FileChooser getFileChooser() { if (fileChooser == null) { java.util.List<String> list = new java.util.ArrayList<String>(); list.add("*.jpeg"); list.add("*.png"); list.add("*.jpg"); list.add("*.gif"); list.add("*.PNG"); FileChooser.ExtensionFilter fe = new FileChooser.ExtensionFilter( "JPEG GIF PNG Image " , list) ; fileChooser = new FileChooser(); fileChooser.getExtensionFilters().add(fe); } return fileChooser; } public static void main(String[] args){ Application.launch(args); } }