我的代码有问题。首先,我创建了一个JfileChooser,以将我的bufferedImage保存到文件中。 问题是当我保存它时,如果我不在窗口中写扩展名,它将是一个普通文件,而不是jpg / png或其他文件。我该怎么办?
我尝试了一些奇怪的代码,例如获取文件扩展名的描述,但是它不起作用
JFileChooser savechooser = new JFileChooser();
savechooser.setFileFilter(new FileNameExtensionFilter("JPEG File", "jpg"));
savechooser.setFileFilter(new FileNameExtensionFilter("PNG File", "png"));
savechooser.setFileFilter(new FileNameExtensionFilter("GIF File", "gif"));
int returnVal = savechooser.showSaveDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
ImageIO.write(bImage, "png" , new File(savechooser.getSelectedFile().getAbsolutePath()));
我希望有一个“ test.png”或“ test.jpeg”,但实际输出将是一个“ test”文件。
答案 0 :(得分:0)
ImageIO.write(...)
(代码中的“ png”)的第二个参数是文件的 format 。这与文件的 name 没有直接关系。 “文件扩展名” 或后缀只是文件名的一部分,可以是任何东西,尽管按照惯例,它用于指示文件格式(即,没有什么阻止您命名) JPEG文件“ foo.gif”(如果您确实愿意的话,它仍然是JPEG文件)。 Windows通常使用此约定来确定文件类型并选择合适的应用程序来打开文件,因此使用非标准扩展名可能会造成混淆。
要解决您遇到的问题,除非用户添加了扩展名,否则最好确保文件名以正确的扩展名结尾。例如(假设用户选择了PNG格式,但是您也可以轻松地将其调整为其他格式):
// JFileChooser code as is
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = savechooser.getSelectedFile();
String fileName = file.getName();
if (!fileName.toLowerCase().endsWith(".png")) {
file = new File(file.getParent(), fileName + ".png");
}
if (!ImageIO.write(image, "PNG" , file)) {
// TODO: Handle file could not be written case
}
}
以上内容将确保文件具有正确的文件扩展名,除非用户自己提供。
我还在您的代码中看到了另一个问题。您调用savechooser.setFileFilter(..)
三次。每次调用都会用新的过滤器替换当前过滤器。您可能想改用savechooser.addChoosableFileFilter(...)
(对于要用作默认值的变量,也许要改用setFileFilter(..)
)。过滤器将过滤对话框中显示的文件,从而过滤用户单击的文件,但不影响用户自己提供的名称。您可以从savechooser.getFileFilter()
获取当前过滤器,并使用该过滤器确定要使用的格式。
这是一个更完整的解决方案:
JFileChooser savechooser = new JFileChooser();
FileNameExtensionFilter pngFilter = new FileNameExtensionFilter("PNG File", "png")
savechooser.addChoosableFileFilter(pngFilter);
savechooser.addChoosableFileFilter(new FileNameExtensionFilter("JPEG File", "jpg"));
savechooser.addChoosableFileFilter(new FileNameExtensionFilter("GIF File", "gif"));
savechooser.setFileFilter(pngFilter); // Default choose PNG
int returnVal = savechooser.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = savechooser.getSelectedFile();
FileNameExtensionFilter currentFilter = (FileNameExtensionFilter) savechooser.getFileFilter();
String ext = currentFilter.getExtensions()[0];
if (!currentFilter.accept(file)) {
// File does not not have the correct extension, fix it
String fileName = file.getName();
file = new File(file.getParent(), fileName + "." + ext);
}
String format = "jpg".equals(ext) ? "JPEG" : ext; // May not be strictly necessary, just a reminder that file ext != file format
if (!ImageIO.write(image, format , file)) {
// TODO: Handle file could not be written case
}
}