write(img,“jpg”,pathtosave)JAVA未将图像文件保存到所选文件路径
我正在VSCode IDE中使用JVM14.0.2。 代码的目的是将原始输入图像更改为灰度图像,并将新的灰度图像保存到所需位置 代码运行时没有异常,我尝试打印一些进度行(System.out.println(“Saving completed…”);这些行在我插入的程序中打印出来。但是,当我转到所选文件路径以搜索保存的灰度图像时,在目录中看不到新图像 然后我尝试了BlueJ IDE,并保存了灰色图像。您能检查一下是VSCode开发环境问题还是我的代码问题吗?或者我需要一个不同的类/方法来编辑VSCode中的图像?谢谢你的帮助。如果你需要更多的细节,请告诉我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
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
将解决此问题。