纯 JavaFX:将图像转换为字节数组(+ 反向操作)。怎么了?
Pure JavaFX: convert Image to bytes Array (+ opposit operation). What's wrong?
用户可以浏览到图像文件。我想将所选文件保存到 BLOB 列中的数据库(derby 数据库)。为此,我需要将 Image 对象转换为字节数组 (byte[]),并检索它我需要:byte[] -> Image.
所以我搜索并找到了这个:从这个question
pure java fx solution trace ( == 你必须补上遗漏的点:)
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 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;
}
注意:对文件系统存储不感兴趣,需要纯JavaFX(无Swing或AWT)
在
pr.getPixels(0, 0, (int) i.getWidth(), (int) i.getHeight(), wf, buffer, 0, 0);
最后一个参数(scanlineStride
)是当您从图像中的一行前进到下一行时数组中的偏移量。由于您将其设置为零,因此您不会增加数组索引并且实际上只写入数组的一个 "row"。
由于此格式每个像素使用 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());
用户可以浏览到图像文件。我想将所选文件保存到 BLOB 列中的数据库(derby 数据库)。为此,我需要将 Image 对象转换为字节数组 (byte[]),并检索它我需要:byte[] -> Image.
所以我搜索并找到了这个:从这个question
pure java fx solution trace ( == 你必须补上遗漏的点:)
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 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;
}
注意:对文件系统存储不感兴趣,需要纯JavaFX(无Swing或AWT)
在
pr.getPixels(0, 0, (int) i.getWidth(), (int) i.getHeight(), wf, buffer, 0, 0);
最后一个参数(scanlineStride
)是当您从图像中的一行前进到下一行时数组中的偏移量。由于您将其设置为零,因此您不会增加数组索引并且实际上只写入数组的一个 "row"。
由于此格式每个像素使用 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());