【发布时间】:2016-08-28 18:24:10
【问题描述】:
用户可以浏览到图像文件。我想将所选文件保存到 BLOB 列中的 db (derby db)。为此,我需要将 Image 对象转换为字节数组(byte[]),并检索它我需要:byte[] -> Image。
所以我搜索并找到了这个:来自这个question
纯java fx解决方案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 条目是有效的(有数字),数组的 ALL THE REST 是 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)
【问题讨论】:
-
我不确定您为什么觉得有必要避免使用 ImageIO,但这样做是在存储未压缩的字节。这真的是你想要的吗?图片会占用大量空间。
-
@VGR 我想要我写的应用程序是 100% JavaFX,没有 AWT,没有 Swing,即使它只是一个实用的代码行(就像在这种情况下一样)。并用于图像压缩。我暂时不需要那个。也许我会在未来的版本中添加它。
标签: java arrays image javafx converter