javafx - 使用 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)
用 this 作为第二个参数而不是调用null
,然后所需的转换将自动完成,JPEG 将按预期写入。
推荐阅读
- azure-devops - 在 VSTS 扩展中打包共享代码
- azure - 如何使用授权进行租户配置 Azure Apimanagement
- node.js - 有没有办法为 mongodb 操作函数创建一个单独的文件并在索引文件中使用这些函数?
- c# - 按条件过滤列表作为元素内的嵌套元素
- python - 是否可以在 Pandas 的 groupby 操作中应用`first()`和`last()`来分隔列?
- mysql - Gem :: 从 MySQL 迁移到 MongoDB 时出现加载错误
- angular - Angular 表单控件基于单选按钮选择进行验证
- python - Pymunk Body 移动而不移动 pymunk 形状顶点
- javascript - 在浏览器上,如何绘制每个 64-128 点的 100k 系列?
- swift - 获取MKMapView中心的经纬度