write(img,“jpg”,pathtosave)JAVA未将图像文件保存到所选文件路径

write(img,“jpg”,pathtosave)JAVA未将图像文件保存到所选文件路径,java,visual-studio-code,vscode-settings,javax.imageio,grayscale,Java,Visual Studio Code,Vscode Settings,Javax.imageio,Grayscale,我正在VSCode IDE中使用JVM14.0.2。 代码的目的是将原始输入图像更改为灰度图像,并将新的灰度图像保存到所需位置 代码运行时没有异常,我尝试打印一些进度行(System.out.println(“Saving completed…”);这些行在我插入的程序中打印出来。但是,当我转到所选文件路径以搜索保存的灰度图像时,在目录中看不到新图像 然后我尝试了BlueJ IDE,并保存了灰色图像。您能检查一下是VSCode开发环境问题还是我的代码问题吗?或者我需要一个不同的类/方法来编辑VS

我正在VSCode IDE中使用JVM14.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
公共类灰度图像{
公共静态void main(字符串args[])引发IOException{
BuffereImage img=null;
//读取图像
试一试{
文件f=新文件(“C:\\original.jpg”);
img=图像读取(f);
//获取图像宽度和高度
int width=img.getWidth();
int height=img.getHeight();
BuffereImage grayimg=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_ARGB);
//转换为灰度
对于(int y=0;y

}如果我正确理解了这个问题,这里的重要教训是
ImageIO.write(…)
返回一个
布尔值,指示它是否成功。您应该处理值为
false
的情况,即使没有异常。有关参考,请参阅

比如:

if(!ImageIO.write(grayimg,“JPEG”,newf)){
System.err.println(“无法将图像存储为JPEG:+grayimg”);
}
现在,由于代码确实在一个JRE中工作而在另一个JRE中不工作的原因,可能与类型为
type\u INT\u ARGB
(即包含alpha通道)的图像有关。这曾经在Oracle JDK/JREs中起作用,但支持:

以前,oraclejdk使用了对广泛使用的ijgjpeg库的专有扩展来提供可选的颜色空间支持。 这是用来支持PhotoYCC和图像与阿尔法组成的读写。此可选支持已在Oracle JDK 11中删除

修复很容易;由于您的源文件是JPEG文件,因此它可能不包含alpha组件,因此您可以更改为不包含alpha的其他类型。由于您需要灰色图像,我认为最好的匹配是:

BufferedImage grayimg=新的BufferedImage(宽度、高度、BufferedImage.TYPE\u字节\u灰度);
但是
TYPE\u INT\u RGB
TYPE\u 3BYTE\u BGR
也应该可以工作,如果您以后在彩色图像上遇到同样的问题。

您的编码似乎还可以(尽管可能不是转换为灰色的最有效/最“正确”的方法)。它在另一个IDE中工作的事实也表明它是好的。您(您的IDE)可能正在使用不同的JRE,其中一个JRE无法存储ARGB JPEG。我相信
ImageIO.write(…)
将从VSCode返回
false
,但从BlueJ返回
true
。不过,您不需要ARGB,因此我认为将
grayImg
更改为
TYPE\u INT\u RGB
,或者更好的是,
TYPE\u BYTE\u GRAY
将解决此问题。