【问题标题】:Pure JavaFX: convert Image to bytes Array (+ opposit operation). What's wrong?纯 JavaFX:将 Image 转换为字节数组(+ 相反操作)。怎么了?
【发布时间】: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


【解决方案1】:

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

最后一个参数(scanlineStride)是当您从图像中的一行前进到下一行时数组中的偏移量。由于您将其设置为零,因此您不会增加数组索引并且实际上只写入数组的一个“行”。

由于这种格式每个像素使用 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());

【讨论】:

  • hh 好笑,我已经试过了。但我忘了应用相反方向的变化。非常感谢 Man 添加该编辑,没有它,这将无法正常工作。你是个聪明人。
猜你喜欢
  • 2016-10-31
  • 1970-01-01
  • 2014-01-07
  • 2017-12-12
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多