【问题标题】:ImageIO.write(img,"jpg",pathtosave) JAVA not saving Image file to selected filepathImageIO.write(img,"jpg",pathtosave) JAVA 不将图像文件保存到选定的文件路径
【发布时间】:2020-10-20 23:36:21
【问题描述】:

我在 VSCode IDE 中使用 JVM 14.0.2。 该代码的目的是将原始输入图像更改为灰度图像,并将新的灰度图像保存到所需位置。

代码无异常运行,我尝试打印一些进度行(System.out.println("Saving completed...");),这些行打印在我插入的整个程序中。但是,当我转到选定的文件路径搜索保存的灰度图像,我在目录中没有看到新图像。

然后我尝试了 BlueJ IDE,并保存了灰色图像。你能检查一下是 VSCode 开发环境问题还是我的代码问题?或者我需要不同的类/方法来编辑 VSCode 中的图像?感谢您的帮助。如果您需要更多详细信息,请告诉我。

public class GrayImage {
public static void main(String args[]) throws IOException {
    BufferedImage img = null;
    // read image
    try {
        File f = new File("C:\\original.jpg");
        img = ImageIO.read(f);

        // get image width and height
        int width = img.getWidth();
        int height = img.getHeight();
        BufferedImage grayimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        // convert to grayscale
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                Color color = new Color(img.getRGB(x, y));
                int r = (int) color.getRed();
                int g = (int) color.getBlue();
                int b = (int) color.getGreen();
                // calculate average
                int avg = (r + g + b) / 3;
                // replace RGB value with avg
                Color newColor = new Color(avg, avg, avg, color.getAlpha());

                grayimg.setRGB(x, y, newColor.getRGB());
            }
        }
        // write image
        System.out.println("Trying to write the new image...");
        File newf = new File("H:\\gray.jpg");
        ImageIO.write(grayimg, "jpg", newf);
        System.out.println("Finished writing the new image...");
    } catch (IOException e) {
        System.out.println(e);
    }
}// main() ends here

}

【问题讨论】:

  • 您的代码看起来不错(尽管,可能不是转换为灰色的最有效/“正确”的方式)。它在另一个 IDE 中工作的事实也表明它很好。可能,您(您的 IDE)正在使用不同的 JRE,其中一个无法存储 ARGB JPEG。我相信ImageIO.write(...) 会从 VSCode 返回 false,但会从 BlueJ 返回 true。不过你不需要 ARGB,所以我认为将 grayImg 更改为 TYPE_INT_RGB,或者更好,TYPE_BYTE_GRAY 将解决它。

标签: java visual-studio-code vscode-settings javax.imageio grayscale


【解决方案1】:

如果我正确理解了这个问题,那么这里的重要教训是ImageIO.write(...) 返回一个boolean,表示它是否成功。您应该处理值为false 的情况,即使没有例外。如需参考,请参阅API doc

类似:

if (!ImageIO.write(grayimg, "JPEG", newf)) {
    System.err.println("Could not store image as JPEG: " + grayimg);
}

现在,由于您的代码 确实 确实在一个 JRE 中而不是在另一个 JRE 中工作,可能与 TYPE_INT_ARGB 类型的图像有关(即包含 alpha 通道)。这曾经在 Oracle JDK/JRE 中工作,但支持是 removed:

以前,Oracle JDK 使用广泛使用的 IJG JPEG 库的专有扩展来提供可选的色彩空间支持。 这用于支持 PhotoYCC 和在读取和写入时具有 alpha 组件的图像。 Oracle JDK 11 中删除了此可选支持。

修复很简单;由于您的源是 JPEG 文件,它可能无论如何都不包含 alpha 组件,因此您可以更改为没有 alpha 的其他类型。因为你想要一个灰色的图像,我相信最好的匹配是:

BufferedImage grayimg = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);

但是TYPE_INT_RGBTYPE_3BYTE_BGR 也应该可以,如果您以后在彩色图像中遇到同样的问题。

【讨论】:

    猜你喜欢
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多