作成途中

java.awt.image.BufferedImageとjavafx.scene.image.Image

java.awt.image.BufferedImage

メモリで管理するイメージで、簡単に描画で使えるイメージとして、古くから存在するクラスである。
	void test(){
		try {
			BufferedImage bufferedImage2 = ImageIO.read(new File("data.java"));
			int w = bufferedImage2.getWidth();
			int h = bufferedImage2.getHeight();
			WritableRaster raster = bufferedImage2.getRaster();
			
			System.out.println("getNumBands:" + raster.getNumBands());//4が表示

			int []bufferSrc = new int[w * h];

			for(int y = 1; y < 100; y++){//rasterを返した描画(これで、緑の線が描けた。)
				raster.setPixel(10, y, new int[]{0,255,0,255});// R,G,B,A 
			}

			//raster.setSamples(0, 0, w, h, 0, bufferSrc);//setPixelではbufferSrcの構造が合わない。
			//this.bufferedImage2.setData(raster);//左の記述は調査中
			
			Graphics g = bufferedImage2.getGraphics();
			g.setColor(Color.RED);
			g.drawLine(5, 5, 10, 10);//通常の描き方
			
			//次のように、int配列のbufferSrcを直接にセットすることや、setRGBで配列に取得することも可能
			bufferedImage2.setRGB(0, 0, w, h, bufferSrc, 0, w);//配列をイメージに書き込む

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	// 以下も配列から生成する方法であるが、検討中(参照:http://nodamushi.hatenablog.com/entry/20110912/1315859917)
	public static BufferedImage createImage(int[] data,int width,int height,int alphaMask,int redMask,int greenMask,int blueMask){
		int[] mask = {redMask,greenMask,blueMask,alphaMask};
		DataBuffer buffer = new DataBufferInt(data, width*height);
		WritableRaster raster = Raster.createPackedRaster(buffer,width,height,width,mask,new Point());
		ColorModel model = new DirectColorModel(32, redMask, greenMask, blueMask, alphaMask);

		return new BufferedImage(model, raster, false, null);
	}

javafx.scene.image.Image

JavaFxの導入時に、改めて用意されたイメージ用クラス。
以下にファイルのURLからイメージを取得して、canvasに描いて、マウス位置の色(RGB)を取得する例を示す。
	canvas.setOnMouseClicked(e->{
		File file = fc.showOpenDialog(primaryStage);
		if(file != null) setImage( file );
		try {
			URL url = file.toURI().toURL();
			Image imageSrc = new Image(url.toExternalForm());//ファイルのURLからイメージを取得
			GraphicsContext gc = canvas.getGraphicsContext2D();//上記キャンバスへの描画ツール取得
		    	gc.drawImage(imageSrc , 0, 0);//描く

			PixelReader pixelReader = imageSrc  .getPixelReader();
			double w = imageSrc.getWidth();
			double h = imageSrc.getHeight();

			int targetRgb = pixelReader.getArgb((int)e.getX(),(int) e.getY());//この点のRGBを取得
			//pixelReader.getPixels(x, y, w, h, pixelformat, buffer, scanlineStride);
			
		} catch (Exception err) {
			err.printStackTrace();
		}			
	});

javafx.scene.image.Imageとjavafx.scene.image.Image

以下で、javafx.scene.image.Imageeからjavafx.scene.image.Imagを生成する例を示す。
	void test(){
		try {
			BufferedImage bufferedImage2 = ImageIO.read(new File("data.java"));
			int w = bufferedImage2.getWidth();
			int h = bufferedImage2.getHeight();
			WritableImage writavleImage = new WritableImage(w , h);
			javafx.scene.image.Image img = SwingFXUtils.toFXImage(bufferedImage2, writavleImage);

			GraphicsContext gc = canvas.getGraphicsContext2D();//上記キャンバスへの描画ツール取得
			gc.drawImage(img , 0, 0);

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

以下で、javafx.scene.image.Imageからjavafx.scene.image.Imageへ変換生成する例を示す。
		RL url = new file("data.jpg").toURI().toURL();
		javafx.scene.image.Image imageSrc = new Image(url.toExternalForm());
		BufferedImage bufImgSrc = new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB);

		// imageSrcからjavafx.scene.image.ImageenoにのbufImgSrcへ変換
		bufImgSrc = SwingFXUtils.fromFXImage(imageSrc, bufImgSrc);


int型配列 を利用したjavafx.scene.image.Imageとjavafx.scene.image.Image

以下で、javafx.scene.image.Imageから得られたint型配列を、javafx.scene.image.Imageに設定する場合の例を示す。
	void test() throws Exception{
		File file = new File("data.jpg");

		URL url = file.toURI().toURL();
		javafx.scene.image.Image imageSrc = new Image(url.toExternalForm());
		int w = (int)imageSrc.getWidth();
		int h = (int)imageSrc.getHeight();
		System.out.printf("Image size w:%d,  h:%d \n", w, h);


	    	// JavaFx からのイメージ用配列(int)取得
	    	WritablePixelFormat<IntBuffer> writablePixelFormat = WritablePixelFormat.getIntArgbInstance();
	    	int[] bufferSrc = new int[w * h];
		this.pixelReader.getPixels(0, 0, w, h, writablePixelFormat, bufferSrc, 0, w);

		// イメージ用配列(int)からBufferedImageを生成
		BufferedImage bufferedImage2 = new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB);
		bufferedImage2.setRGB(0, 0, w, h, bufferSrc, 0, w);//配列をイメージに書き込む

		ImageIO.write(bufferedImage2, "png", new File("T.png"));//検証でファイル保存

	}