我以最小形式重新创建了该问题:
主要:
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中什么也没有发生。
那么如何创建格式不是png
而是jpeg
之类的图像?
我还检查了ImageIO支持的格式,这些格式返回以下格式:
JPG, jpg, tiff, bmp, BMP, gif, GIF, WBMP, png, PNG, JPEG, tif, TIF, TIFF, wbmp, jpeg
答案 0 :(得分:3)
首先,我可以确认JavaFX 13 EA内部版本13的这种行为。这可能是修复OP早已提到的旧错误(图像变成粉红色)的非常简单的尝试,我很久以前就报告过。问题在于,JPEGS无法存储Alpha信息,并且过去,当将具有Alpha通道的图像写为JPEG时,输出只是乱码。现在,此修复程序完全拒绝写出图像,而不仅仅是忽略alpha通道。
一种解决方法是在您明确指定没有alpha通道的颜色模型的情况下复制图像。
以下是原始错误报告,其中还包含解决方法:https://bugs.openjdk.java.net/browse/JDK-8119048
以下是一些简化转换的信息: 如果将此行添加到代码中
BufferedImage awtImage = new BufferedImage((int)img.getWidth(), (int)img.getHeight(), BufferedImage.TYPE_INT_RGB);
然后调用SwingFXUtils.fromFXImage(img, awtImage)
作为第二个参数而不是null
,然后将自动完成所需的转换,并按预期写入JPEG。
答案 1 :(得分:1)
除了mipa的答案之外,如果您没有可用的SwingFXUtils,则可以将BufferedImage克隆到另一个没有alpha通道的BufferedImage中:
BufferedImage withoutAlpha = new BufferedImage(
(int) originalWithAlpha.getWidth(),
(int) originalWithAlpha.getHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics g = withoutAlpha.getGraphics();
g.drawImage(originalWithAlpha, 0, 0, null);
g.dispose();