ユーザーは画像ファイルを参照できます。選択したファイルを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)
を私は、あなたがImageIOでを回避する必要性を感じる理由はわからないんだけどそうすることで、圧縮されていないバイトを格納しています。それは本当にあなたが望むものですか?画像はかなりのスペースを占めることがあります。 – VGR
@VGRよくやってみたい私が書いているアプリケーションは、コードのユーティリティライン(この場合のような)であっても、100%JavaFX、AWT、no Swingではありません。画像圧縮のため。私は今のところそれを必要としません。多分私は将来のバージョンでそれを追加します。 – usertest