0

こんにちは、私は Java の問題を抱えています。私の上級研究クラスでは、ほぼ終了しましたが、生成した画像のデータを分析する必要があります。必須の課題の一部ではないため、これを宿題としてタグ付けしたくありません...結果を収集するために自分で思いついたものです. 2 つの画像をピクセル単位で比較するプログラムを作成しました。これは、2 つのディレクトリ内のすべての .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 の 1 つのセットが正常に読み取られ、別のセットが機能しない原因は何でしょうか? 必要なファイルはすべて他のプログラムで開くことができるので、ファイルが破損することはありません。すべてのプロパティは同じように見えます。1 つのディレクトリは Gimp で手作りされ (これらは問題なく読み取れます)、別のディレクトリは Java ベースのプログラムによって生成されました。これらは Gimp、ペイント、Photoshop などで読み取ることができますが、私のコードでは読み取れません。

どんな助けでも大歓迎です、ありがとう!

編集:元に戻されたコードを使用するのを忘れていました...私はそれを台無しにしてから、いくつかの悪いバージョンを投稿しました。それ以外の場合は機能するコードに関する元の問題を示すように改訂されました。問題をさらに説明すると、両方のディレクトリを変更して、testExpect2 フォルダーで expectedFiles[] のファイル リストを検索すると、正常に実行されます。また、System.out.println(actualFiles[i]エラーが発生する前に正しいファイル名が出力されるため、正しいファイルが文字列配列に読み込まれていることがわかります。

4

2 に答える 2

3
new File("C:\\Users\\Rowe\\workspace\\Senior Research\\testExpect"+expectedFiles[i])

ディレクトリを に短縮しましょうC:\\yourDir。あなたのコードは次のようなパスを生成します

C:\\yourDirexpectedFiles1.bmp

あなたが望むものではありません:

C:\\yourDir\\expectedFiles1.bmp

パス区切りを忘れました。

two-File-arg コンストラクターを使用して次のことを行う方がはるかに優れていますFile

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

それが役立つことを願っています!

于 2011-04-19T07:43:37.283 に答える
1

問題のある行では、actualFiles[i]代わりにexpectedFiles[i]?

于 2011-04-19T07:50:22.827 に答える