2016-05-03 1 views
0

ユーザーは画像ファイルを参照できます。選択したファイルをBLOB列のdb(derby db)に保存します。これを行うには、Imageオブジェクトをバイト配列(byte [])に変換し、それを取得する必要があります:byte [] - > Image。純粋なJavaFX:イメージをバイトに変換する配列(+反対の操作)。どうしましたか?

だから私は検索し、これを見つけた:このquestion

から純粋なJava FXのソリューションは、私はこの方法で実装(==あなたが不足している箇所に記入する必要があります:)

Image i = logo.getImage(); 
PixelReader pr = i.getPixelReader(); 
PixelFormat f = pr.getPixelFormat(); 

WriteablePixelFromat wf = f.getIntArgbInstance(); //??? 

int[] buffer = new int[size as desumed from the format f, should be i.width*i.height*4]; 

pr.getPixels(int 0, int 0, int i.width, i.height, wf, buffer, 0, 0); 

をトレース

private ImageByteInfo imageToByteArray(Image i){ 
     PixelReader pr = i.getPixelReader(); 
     WritablePixelFormat<ByteBuffer> wf = PixelFormat.getByteBgraInstance(); 

     byte[] buffer = new byte[(int) (i.getWidth() * i.getHeight() *4)]; 

     pr.getPixels(0, 0, (int) i.getWidth(), (int) i.getHeight(), wf, buffer, 0, 0); 

     return new ImageByteInfo(buffer, (int) i.getWidth(), (int) i.getHeight()) ; 
    } 

私はバッファ配列を調べるときを除いて。私は、最初の4096エントリだけが有効であることがわかりました(番号を持っています)。配列の残りはすべて0 0 0 0 0です。

どうしてこれを修正できますか?ありがとう。

これは固定配列からの画像を取得する方法です。これは正しいかどうか?

private Image byteArrayToImage(ImageByteInfo imageArray){ 

     WritablePixelFormat<ByteBuffer> wf = PixelFormat.getByteBgraInstance(); 

     WritableImage writableimage = new WritableImage(imageArray.getWidth(), imageArray.getHeight()); 

     PixelWriter pixelWriter = writableimage.getPixelWriter(); 

     pixelWriter.setPixels(0, 0, imageArray.getWidth(), imageArray.getHeight(), wf, imageArray.getByteImage(), 0, 0); 

     return writableimage; 
    } 

注:ファイル・システムの記憶域に興味を持っていない、そしてそれは

pr.getPixels(0, 0, (int) i.getWidth(), (int) i.getHeight(), wf, buffer, 0, 0); 

では純粋のJavaFX(ノースウィングまたはAWT)

+0

を私は、あなたがImageIOでを回避する必要性を感じる理由はわからないんだけどそうすることで、圧縮されていないバイトを格納しています。それは本当にあなたが望むものですか?画像はかなりのスペースを占めることがあります。 – VGR

+1

@VGRよくやってみたい私が書いているアプリケーションは、コードのユーティリティライン(この場合のような)であっても、100%JavaFX、AWT、no Swingではありません。画像圧縮のため。私は今のところそれを必要としません。多分私は将来のバージョンでそれを追加します。 – usertest

答えて

2

する必要があり、最後の引数(scanlineStride)イメージのある行から次の行に進むときの配列へのオフセットです。ゼロに設定するので、配列のインデックスをインクリメントするのではなく、効率的に配列の1行だけを書き込むことになります。

このフォーマットは、ピクセルあたり4つのバイトを使用していますので、あなたは4*imageArray.getWidth()の走査線ストライド必要があります。

同様
pr.getPixels(0, 0, (int) i.getWidth(), (int) i.getHeight(), wf, buffer, 0, 4*imageArray.getWidth()); 

pixelWriter.setPixels(0, 0, imageArray.getWidth(), imageArray.getHeight(), wf, imageArray.getByteImage(), 0, 4*imageArray.getWidth()); 
+0

hh面白い、私はすでにそれを試みた。私は反対の方向に変更を適用することを忘れました。この編集を追加してくれてありがとう、ありがとう。それがなければ、これはうまくいきません。あなたはスマートな男です。 – usertest

関連する問題