【问题标题】:Writing javafx.scene.image.Image to file?将 javafx.scene.image.Image 写入文件?
【发布时间】:2015-01-19 04:53:55
【问题描述】:

我将如何将 javafx.scene.image.Image 图像写入文件。我知道您可以在 BufferedImages 上使用 ImageIO,但是有什么方法可以使用 javafx Image 来做到这一点?

【问题讨论】:

    标签: java image file-io javafx


    【解决方案1】:

    首先将其转换为BufferedImage,使用javafx.embed.swing.SwingFXUtils

    Image image = ... ; // javafx.scene.image.Image
    String format = ... ;
    File file = ... ;
    ImageIO.write(SwingFXUtils.fromFXImage(image, null), format, file);
    

    【讨论】:

      【解决方案2】:

      差不多 3 年后,我现在有知识去做并回答这个问题。是的,最初的答案也是有效的,但它涉及首先将图像转换为 BufferedImage ,理想情况下我希望完全避免摇摆。虽然这确实输出了图像的原始 RGBA 版本,但对于我需要做的事情来说已经足够了。我实际上可以只使用原始 BGRA,因为我正在编写软件来打开结果,但由于 gimp 无法打开,我想我会将其转换为 RGBA。

      Image img = new Image("file:test.png");
      int width = (int) img.getWidth();
      int height = (int) img.getHeight();
      PixelReader reader = img.getPixelReader();
      byte[] buffer = new byte[width * height * 4];
      WritablePixelFormat<ByteBuffer> format = PixelFormat.getByteBgraInstance();
      reader.getPixels(0, 0, width, height, format, buffer, 0, width * 4);
      try {
          BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("test.data"));
          for(int count = 0; count < buffer.length; count += 4) {
              out.write(buffer[count + 2]);
              out.write(buffer[count + 1]);
              out.write(buffer[count]);
              out.write(buffer[count + 3]);
          }
          out.flush();
          out.close();
      } catch(IOException e) {
          e.printStackTrace();
      }
      

      【讨论】:

      • @Cypher 每个颜色值是 0-255(1 个字节),每个像素有 4 个:蓝色、绿色、红色和 alpha(透明)
      • 这对每种图像格式都有效吗?如果图像没有像 jpg 那样的透明度怎么办?
      • @JFValdes 我没有用 JPEG 尝试过,但我的猜测是,由于像素格式是使用 PixelFormat.getByteBgraInstance() 获取的,所以它总是有一个 alpha 通道。我的假设是,在 JPEG 的情况下,所有的 alpha 值都是 0xFF。我可以在有时间的时候对其进行测试,假设您还没有,我会回复您。
      • @JFValdes 是的,它适用于 jpeg。我怀疑 alpha 值最终都为 0xFF。
      • 小心,我认为这种方法不适用于动画 GIF,因为我认为 getPixelReader() 在这种情况下会返回 null
      猜你喜欢
      • 2016-01-16
      • 2016-04-13
      • 2011-01-28
      • 2018-07-22
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      相关资源
      最近更新 更多