【发布时间】:2015-01-19 04:53:55
【问题描述】:
我将如何将 javafx.scene.image.Image 图像写入文件。我知道您可以在 BufferedImages 上使用 ImageIO,但是有什么方法可以使用 javafx Image 来做到这一点?
【问题讨论】:
我将如何将 javafx.scene.image.Image 图像写入文件。我知道您可以在 BufferedImages 上使用 ImageIO,但是有什么方法可以使用 javafx Image 来做到这一点?
【问题讨论】:
首先将其转换为BufferedImage,使用javafx.embed.swing.SwingFXUtils:
Image image = ... ; // javafx.scene.image.Image
String format = ... ;
File file = ... ;
ImageIO.write(SwingFXUtils.fromFXImage(image, null), format, file);
【讨论】:
差不多 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();
}
【讨论】:
PixelFormat.getByteBgraInstance() 获取的,所以它总是有一个 alpha 通道。我的假设是,在 JPEG 的情况下,所有的 alpha 值都是 0xFF。我可以在有时间的时候对其进行测试,假设您还没有,我会回复您。
getPixelReader() 在这种情况下会返回 null。