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

时间:2019-08-27 10:47:46

标签: javafx jpeg 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);
    }
}

重要提示: :我正在使用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

2 个答案:

答案 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();