Javax ImageIO IIOException 显然没有理由

Posted

技术标签:

【中文标题】Javax ImageIO IIOException 显然没有理由【英文标题】:Javax ImageIO IIOException for apparently no reason 【发布时间】:2011-04-19 07:38:12 【问题描述】:

大家好,我有一个 Java 问题。对于我的高级研究课程,我几乎完成了,但我只需要分析我生成的图像中的一些数据。我不想将其标记为家庭作业,因为它不是任何必需作业的一部分……这是我自己想出的收集结果的东西。我写了一个程序,逐像素比较两个图像。它对两个目录中的所有 .bmp 文件执行此操作。现在,我的程序将文件名读入一个字符串数组,并检查了所有文件名的值,所以我知道目录和文件名最初可以正常访问。这是有问题的代码:

    public static void main(String[]args) throws IOException

    File actualDir = new File("C:\\Users\\Rowe\\Desktop\\testExpect");
    String actualFiles[] = actualDir.list();
    File expectedDir = new File("C:\\Users\\Rowe\\Desktop\\testExpect2");
    String expectedFiles[] = expectedDir.list();
    int[][] stats = new int[actualFiles.length][6];                             // Holds all info
            //Columns, Rows, Total, redMatches, shouldaBeenRed, badRed
    for(int i = 0; i < actualFiles.length; i++)
    
        BufferedImage actualImage = null;
        System.out.println(actualFiles[i]);   //THIS PRINTS PROPERLY
        System.out.println(System.getProperty("user.dir"));  //FOR TESTING
        actualImage = ImageIO.read(new File("C:\\Users\\Rowe\\Desktop\\testExpect\\"+actualFiles[i]));   //ERROR HERE

        BufferedImage expectedImage = null;
        expectedImage = ImageIO.read(new File("C:\\Users\\Rowe\\Desktop\\testExpect2\\"+expectedFiles[i]));  //THIS IMAGE WORKS

...rest of code

现在,当我将目录更改为相同时,程序会运行,并检测到所有像素都是 100% 相似的(应该如此,所以我知道程序会执行我想要它执行的操作)。这是错误:

Exception in thread "main" javax.imageio.IIOException: Can't read input file! at javax.imageio.ImageIO.read(Unknown Source) at PixelCompare.main(PixelCompare.java:22)

我尝试了不同的目录都无济于事。可能与 .bmp 文件有关吗?是什么让一组 BMP 读得很好,而另一组却不能工作?我可以在其他程序中打开所有需要的文件,因此它们不会损坏。所有属性似乎都相同。一个目录是用 Gimp 手工制作的(这些读起来很好),另一个是由基于 Java 的程序生成的。这些可以在 Gimp、Paint、Photoshop 等中读取,但它们不会在我的代码中读取。

非常感谢任何帮助,谢谢!

编辑:忘记使用还原代码...我搞砸了,然后发布了一些错误的版本。已修改以显示其他功能代码的原始问题。进一步描述问题:如果您将两个目录都更改为在 testExpect2 文件夹中查找 expectedFiles[] 中的文件列表,它将成功运行。此外,System.out.println(actualFiles[i] 在错误发生之前打印正确的文件名,所以我知道正确的文件正在被读入字符串数组。

【问题讨论】:

我很困惑 - 我认为代码在任何情况下都不会起作用,因为它似乎没有在目录名和文件名之间放置反斜杠,因为它应该。跨度> 其他说明:您使用了两次expectedFiles[i]actualFiles[i] 仅用于调试输出。这很可疑。 您确定 expectedFiles[] 包含相对路径吗? 嘿伙计们,对不起,这看起来很奇怪......我从我现在正在使用的版本中复制并粘贴了它。当我将双反斜杠添加到字符串的末尾时,它可以工作......并且当我在一个目录中检查功能时,我在早期测试中使用了两次预期文件。做出改变以反映这一点。原来的问题仍然存在。 【参考方案1】:
new File("C:\\Users\\Rowe\\workspace\\Senior Research\\testExpect"+expectedFiles[i])

让我们将目录缩短为C:\\yourDir。您的代码将产生类似

的路径
C:\\yourDirexpectedFiles1.bmp

不是你想要的:

C:\\yourDir\\expectedFiles1.bmp

您忘记了路径分隔符。

FileFile使用双File-arg构造函数会好很多:

File actualImageFile = new File(actualDir, expectedFiles[i]);
actualImage = ImageIO.read(actualImageFile);

希望有帮助!

【讨论】:

这只是我的一个糟糕的复制和粘贴。在我尝试访问actualFiles 的第一个BMP 文件之前,一切都被正确访问,即使所有文件都正确列在actualFiles 字符串数组中。 您可以在调用 ImageIO 之前放置断言吗?喜欢...assert actualImageFile.isFile() &amp;&amp; actualImageFile.canRead(); sjr,我不知道 assert 语句到底做了什么让我的代码以不同的方式工作......但你太棒了。为了安全起见,我应该对第二个 ImageIO 调用做同样的事情吗? 断言没有改变任何东西,只是把那些“\\”放回去确实为你解决了问题。 ;) 叹息...我不明白为什么它一直对一个人有效,而不是对另一个有效,但无论如何。它的工作,你赢得了奖品。【参考方案2】:

在有问题的那一行,不应该是actualFiles[i]而不是expectedFiles[i]吗?

【讨论】:

是的......我的复制和粘贴错误。问题仍然存在,请参阅 cmets。感谢您的提醒! @rownage:那就试试 sjr 的回答吧。

以上是关于Javax ImageIO IIOException 显然没有理由的主要内容,如果未能解决你的问题,请参考以下文章

用 javax.imageio 实现图片压缩原理是啥?

Java 读取/缩小图片:javax.imageio.IIOException: Unsupported Image Type

Javax ImageIO IIOException 显然没有理由

解决tomcat报错javax.imageio.IIOException: Can't create output stream!

javax.imageio.IIOException: Can't read input file!完美解决

java IMAGEIO