gpt4 book ai didi

java - 有没有办法使用 JfileChooser 中选择的扩展名来保存 bufferedImage?

转载 作者:行者123 更新时间:2023-11-30 05:41:48 27 4
gpt4 key购买 nike

我的代码有问题。首先,我创建了一个 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”,但实际输出将是一个“测试”文件..

最佳答案

ImageIO.write(...) 的第二个参数(代码中的“png”)是文件的格式。这与文件的名称没有直接关系。 “文件扩展名”或后缀只是文件名的一部分,并且可以是任何内容,尽管按照惯例,它用于指示文件的格式(即,没有什么可以阻止您命名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
}
}

关于java - 有没有办法使用 JfileChooser 中选择的扩展名来保存 bufferedImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498041/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com