Java - выполняет функцию для вновь созданных файлов в каталоге - PullRequest
0 голосов
/ 21 февраля 2012

У меня возникают проблемы при запуске какого-то кода, который я разрабатываю.

Он должен работать следующим образом:

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");
}

Я даже пытался добавить временную задержку между вызовами методов, чтобы позволить системе обновляться для обнаружения вновь созданных [greyscale] изображений (в directory (y)), но это делаетне имеет значения, и изображения распознаются и преобразуются в двоичный формат только при соблюдении двух условий:

  1. В 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 читается / обрабатывается?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2012

Возможно, вы захотите использовать Apache IO FileAlterationObserver и FileAlterationMonitor . Там вы можете добавить свой собственный FileAlterationListener , который выполняет преобразования для соответствующих событий (например, onFileCreate(File) и onFileChange(File)).

0 голосов
/ 21 февраля 2012

Я обнаружил, в чем проблема, и теперь решил ее.

Спасибо тем, кто предоставил полезные советы.

0 голосов
/ 21 февраля 2012

Используете ли вы какой-либо буфер для записи новых файлов?Обязательно промойте и закройте его перед началом преобразования в двоичный файл.

РЕДАКТИРОВАТЬ: Почему вы создаете BufferedImage inputImg, а затем сразу назначаете его другой переменной BufferedImage img?Я не вижу причин для этого.

После ImageIO.write () попробуйте добавить в bimg.flush ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...