【发布时间】:2022-04-21 21:57:55
【问题描述】:
我需要一种快速的 Java 方法来检查 JPEG 文件是否有效,或者它是否是截断/损坏的图像。
我尝试了几种方法:
-
使用 javax.ImageIO 库
public boolean check(File image) throws IOException { try { BufferedImage bi = ImageIO.read(image); bi.flush(); } catch (IIOException e) { return false; } return true; }但它只能检测到我测试过的文件中的少数损坏文件,而且速度非常慢(在我的 PC 上大约 1 张图像/秒)。
-
public boolean check(File image) throws IOException { JpegImageParser parser = new JpegImageParser(); ByteSourceFile bs = new ByteSourceFile(image); try { BufferedImage bi = parser.getBufferedImage(bs, null); bi.flush(); return true; } catch (ImageReadException e) { return false; } }这段代码可以检测到我测试过的所有损坏的图像,但是性能很差(在我的电脑上不到 1 张图像/秒)。
我正在寻找 UNIX 程序 jpeginfo 的 Java 替代方案,它的速度大约快 10 倍(在我的 PC 上大约 10 张图像/秒)。
【问题讨论】:
-
您是否使用特定属性来知道 JPEG 已损坏?我希望 BufferedImage 或 JpegImageParser 正在查看整个文件,这会解释它比您想要的要慢吗?
-
损坏的意思是丢失了一些数据,例如截断的文件。我需要检查的图像集来自在格式化的硬盘驱动器上运行的恢复程序(我忘记了备份中的文件夹......),许多恢复的文件已损坏,部分数据丢失,所以这些图像毫无用处。我正在寻找的是在 JPEG 文件结构中寻找问题而不将其转换为光栅图像(这是一项昂贵的操作)的东西。谢谢