JavaFX将Canvas内容保存为PNG文件时无后缀问题求解
问题说明
你遇到的保存文件无.png后缀的问题,本质是文件后缀补全逻辑缺失,不影响文件本身的内容有效性:
保存后的文件二进制内容为标准PNG格式,因此你的程序可以正常读取显示,仅操作系统因缺少后缀标识无法识别文件类型。
问题根因
ImageIO.write()的格式参数填写错误:该方法第二个参数为格式标识,需传入不带小数点的png,你当前传入的.png不符合规范,且该方法不会自动为输出文件追加后缀FileChooser未配置PNG格式过滤规则,也未做后缀自动补全逻辑,用户输入文件名时如果未手动添加.png,生成的文件就没有后缀
修复代码
仅需要修改保存按钮的事件逻辑,修改后的代码如下:
// Save save.setOnAction((e)->{ FileChooser savefile = new FileChooser(); savefile.setTitle("Save File"); // 添加PNG格式过滤器 FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("PNG图片 (*.png)", "*.png"); savefile.getExtensionFilters().add(extFilter); File file = savefile.showSaveDialog(primaryStage); if (file != null) { // 自动补全.png后缀 String filePath = file.getAbsolutePath(); if (!filePath.toLowerCase().endsWith(".png")) { file = new File(filePath + ".png"); } try { WritableImage writableImage = new WritableImage(1080, 790); canvas.snapshot(null, writableImage); RenderedImage renderedImage = SwingFXUtils.fromFXImage(writableImage, null); // 修正格式参数为不带点的png ImageIO.write(renderedImage, "png", file); } catch (IOException ex) { System.out.println("保存失败!"); ex.printStackTrace(); } } });
修复效果
修改后保存文件时,文件选择器会默认只显示PNG格式,用户输入文件名时即使不手动加.png,程序也会自动补全,操作系统可以正常识别为PNG图片文件。
内容的提问来源于stack exchange,提问作者Mohammed Hamdoon
相关产品推荐
相关产品推荐

