2012-02-20 15 views
0

開発中のコードを実行する際に問題が発生しています。Java - ディレクトリ内の新しく生成されたファイルに対して機能を実行する

それは以下のような動作するはずです:

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枚の画像を持っており、これまでのすべてのイメージが正常にグレースケールに変換し、新しいディレクトリに保存されます。しかし、バイナリ変換では、新しいディレクトリ内の画像を検出しないように見える問題が発生し、のコードが実行される前に[画像]ファイルがすでにディレクトリ内に存在する場合にのみ動作するように見えます。

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)に)、これは、任意の違いを確認しないと画像のみ認識され、2つの条件が満たされたときにバイナリに変換される:

  1. directory (y)
  2. 中に存在するイメージがあります
  3. またはのコードが実行されます。最初にのコードが実行される前に、ディレクトリ内に[画像]ファイルがある場合は、コードが実行されます。

新しく生成されたグレースケール画像が作成され、バイナリに変換されるとすぐに検出できるようにする方法はありますか?

多くのありがとうございます。

UPDATE:次のようにグレースケールに変換するための私のコードは次のとおりです。

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()機能を追加するために、これを修正するのでしょうか?

UPDATE:java.lang.NullPointerException (BINARY) test_images\Greyscale\desktop.ini: processed successfully. Binary image conversion complete.それは言うべき一方:(BINARY) images\298.jpg: processed successfully.私はまた、成功した各変換後に出力し、binary方法から、私が持っている唯一のフィードバックがある行を作成しました。

これには何らかの理由がありますか? desktop.iniファイルが読み込まれて処理される理由を理解できませんか?

+0

...ファイルが書き込まれて閉じられた場合、すぐにJavaからアクセスできます。だから、コードに何か問題がある可能性が高いです。私たちは見ることができません。 –

+1

どのようにファイルを検出していますか?新しいファイルを作成するときに新しいファイルを適切に閉じていることを確認してください。 – DNA

+0

元の投稿に関連コードを追加しました。 – MusTheDataGuy

答えて

0

私は問題の原因を発見し、問題を解決しました。

役に立つ提案をいただいた皆様に感謝します。

+0

これは私の意図だったので、なぜこのコメントを投稿しましたか... しかし、私は翌日まで自分の答えを受け入れることができません。 – MusTheDataGuy

0

新しいファイルを書き出すためにバッファを使用していますか?バイナリへの変換を開始する前に、必ずフラッシュして閉じてください。

EDIT:なぜ、BufferedImage inputImgを作成し、別のBufferedImage変数imgに直接割り当てるのですか?私はそれをする理由を見ません。

ImageIO.write()の後にbimg.flush()を追加してみます。

+0

はい、私はそれに関連するコードを追加したので、元の投稿をもう一度見てください。ありがとうございました。 – MusTheDataGuy

+0

ありがとうございます。私はこれを試みましたが、これは問題を解決していません。私は成功した各変換の後に出力する行を作成し、 'binary'メソッドからの唯一のフィードバックは' java.lang.NullPointerException (BINARY)test_images \ Greyscale \ desktop.ini:正常に処理されました。 バイナリイメージの変換が完了しました。一方、 '(BINARY)images \ 298.jpg:processed successfully。 'と表示されます。何か案は? – MusTheDataGuy

関連する問題