使用 ImageIO.write 写入 jpg 或 jpeg 图像不会创建图像文件

Ric*_*cky 6 jpeg javafx javax.imageio

我以最小的形式重新创建了这个问题:

主要的:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

重要提示:我使用的是 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
Run Code Online (Sandbox Code Playgroud)

mip*_*ipa 6

首先,我可以确认 JavaFX 13 ea build 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);
Run Code Online (Sandbox Code Playgroud)

然后SwingFXUtils.fromFXImage(img, awtImage)使用 this 作为第二个参数而不是调用null,那么所需的转换将自动完成,JPEG 按预期写入。