我以最小的形式重新创建了这个问题:
主要:
public class ImageIOMain extends Application {
@Override
public void start(Stage stage) throws Exception{
Scene scene = new Scene(new StackPane(), 800.0, 600.0);
stage.setScene(scene);
stage.show();
WritableImage img = scene.snapshot(null);
//Image file created on desktop
ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", new File("D:\\Desktop\\test.png"));
//Image file NOT created on desktop
ImageIO.write(SwingFXUtils.fromFXImage(img, null), "jpeg", new File("D:\\Desktop\\test.jpeg"));
}
public static void main(String[] args) {
launch(args);
}
}
重要提示:我正在使用 JavaFX 12。
如果我将图像导出为
png
图像显示在我的桌面上。如果文件格式是例如 jpeg
然后不会创建图像。过去当我使用 JavaFX 8 保存为
jpeg
使用上面的代码导致图像变成粉红色。现在在版本 12 中没有任何 react 。那么如何创建格式不是
png
的图像?但其他类似 jpeg
?我还检查了 ImageIO 支持的格式,这些格式返回:
JPG, jpg, tiff, bmp, BMP, gif, GIF, WBMP, png, PNG, JPEG, tif, TIF, TIFF, wbmp, jpeg
最佳答案
首先,我可以确认 JavaFX 13 ea build 13 的这种行为。这可能是一个非常简单的尝试来修复我很久以前报告过的 OP 已经提到的旧错误(图像变成粉红色)。问题是 JPEGS 无法存储 alpha 信息,并且在过去,当具有 alpha channel 的图像被写为 JPEG 时,输出只是乱码。现在的修复只是拒绝写出图像,而不是忽略 alpha channel 。
一种解决方法是在您明确指定没有 Alpha channel 的颜色模型的位置复制图像。
以下是包含解决方法的原始错误报告:Loading...
以下是简化转换的更多信息:
如果您将此行添加到您的代码中
BufferedImage awtImage = new BufferedImage((int)img.getWidth(), (int)img.getHeight(), BufferedImage.TYPE_INT_RGB);
然后调用
SwingFXUtils.fromFXImage(img, awtImage)
将此作为第二个参数,而不是 null
,然后将自动完成所需的转换,并按预期写入 JPEG。
关于javafx - 使用 ImageIO.write 写入 jpg 或 jpeg 图像不会创建图像文件,我们在Stack Overflow上找到一个类似的问题: javafx - Writing jpg or jpeg image with ImageIO.write does not create image file - Stack Overflow