纯 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());