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.pngJavaFX_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);
     } 
      
    }