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



我以最小形式重新创建了该问题:

主要:

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

首先,我可以确认 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);

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

除了 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();

相关内容

  • 没有找到相关文章

最新更新