运行我正在开发的代码时遇到问题。
它应该如此工作:
For all images within directory (x)
Read image
Convert to greyscale
Save to new directory (y)
For all images within new directory (y)
Read image
Convert to binary
Save to new directory (z)
End for
End for
目前我有300张图像,到目前为止所有图像都已成功转换为灰度并保存到新目录。但是,二进制转换是出现问题的地方,因为它似乎没有检测到新目录中的任何图像,并且只有在执行代码之前目录中已存在[image]文件时才能显示工作。
因此,以下是实际发生的事情:
All files in directory (x) are read
All files in directory (x) are converted to greyscale and saved to new directory (y)
All files in directory (y) are read
It appears that directory (y) is empty (but, in fact, contains 300 greyscale images)
Program ends
然而,当我第二次运行程序时,无论是300张灰度图像还是单张图像,directory (y)
中的图像都成功转换为二进制;它似乎仅在目录中存在预先存在的图像时才起作用,而不是在即时创建新转换的灰度图像时。
该方法调用如下:
public static void processFiles(){
processGreyscale();
System.out.println("Greyscale image conversion complete.\n");
processBinary();
System.out.println("Binary image conversion complete.\n");
}
我甚至尝试在方法调用之间添加一个时间延迟,以允许系统更新自身以检测新创建的[灰度]图像(在directory (y)
中),但这不会产生任何影响差异和图像只有在满足两个条件时才被识别并转换为二进制:
directory (y)
有没有办法这样做,以便新生成的灰度图像一旦被创建然后转换为二进制就可以被检测到?
非常感谢。
更新:我转换为灰度的代码如下:
try{
//Read in original image.
BufferedImage inputImg = ImageIO.read(image);
//Obtain width and height of image.
double image_width = inputImg.getWidth();
double image_height = inputImg.getHeight();
//New images to draw to.
BufferedImage bimg = null;
BufferedImage img = inputImg;
//Draw the new image.
bimg = new BufferedImage((int)image_width, (int)image_height, BufferedImage.TYPE_BYTE_GRAY);
Graphics2D gg = bimg.createGraphics();
gg.drawImage(img, 0, 0, img.getWidth(null), img.getHeight(null), null);
//Save new binary (output) image.
String fileName = "greyscale_" + image.getName();
File file = new File("test_images\\Greyscale\\" + fileName);
ImageIO.write(bimg, "jpg", file);
}
catch (Exception e){
System.out.println(e);
}
如何修改此内容以添加flush()
和/或close()
函数?
更新:我还创建了一个在每次成功转换后打印的行,我从binary
方法获得的唯一反馈是:java.lang.NullPointerException (BINARY) test_images\Greyscale\desktop.ini: processed successfully. Binary image conversion complete.
,但它应该说: (BINARY) images\298.jpg: processed successfully.
。
这有什么理由吗?我不明白为什么读取/处理desktop.ini
文件?
答案 0 :(得分:0)
您是否使用任何类型的缓冲区来写出新文件?在开始转换为二进制文件之前,请确保刷新并关闭它。
编辑:为什么要创建一个BufferedImage inputImg,然后将其直接分配给另一个BufferedImage变量img?我认为没有任何理由这样做。
在ImageIO.write()之后尝试添加bimg.flush()。
答案 1 :(得分:0)
您可能希望使用Apache IO&#39 {s} FileAlterationObserver和FileAlterationMonitor。在那里,您可以添加自己的FileAlterationListener来执行适当事件的转换作业(例如onFileCreate(File)
和onFileChange(File)
)。
答案 2 :(得分:0)
我已经发现了问题所在并且现在已经解决了这个问题。
感谢那些提供有用建议的人。