🧐

Processingで特定のディレクトリを監視して動的に画像を読み込む

2024/01/24に公開

Processingを使って特定のディレクトリにある画像ファイルを監視して,ディレクトリにある画像だけを画面に描画するようなプログラムを作ってみます.


https://i.gyazo.com/6f9a2c375897c9d517d719851262b179.mp4

シンプルにできるだけ標準的な機能だけを使って実装しています.

ディレクトリ構造としてはシンプルでプログラム本体のあるディレクトリ以下にimagesというディレクトリを作成して,その中身を監視します.

.
├── FileCheck.pde
├── images
│   ├── ....png
│   └── ....png
└── out

コードは以下の通り

1秒ごとにディレクトリのファイル一覧を取得して,追加されたもの,削除されたものを検出して,それを描画するオブジェクトの画像として取り込んでいます.

FileCheck.pde
import java.io.File;
import java.util.List;
import java.util.Arrays;

int lastTime = 0;
File folder;
List<File> listOfFiles;
List<File> loadedFiles;
PImage img;
ArrayList<ImageObj> ImageObjList = new ArrayList<ImageObj>();

void setup() {
    size(800, 600);
    background(255);
    
    folder = new File(sketchPath()+"/images");
    loadedFiles = new ArrayList<File>(Arrays.asList(folder.listFiles()));
    
    for (File file : loadedFiles) {
        if (file.isFile() && file.getName().endsWith(".png")) {
            println(file.getName() + "が読み込まれました");
            ImageObjList.add(new ImageObj(loadImage(file.getAbsolutePath()), file.getName()));
        }
    }
    
}

void draw() {
    background(150);
    int currentTime = millis();
    if (currentTime - lastTime >= 1000) { // 1秒経過したか確認
        listOfFiles = new ArrayList<File>(Arrays.asList(folder.listFiles())); // 最新のフォルダ内の一覧を取得

        ArrayList<File> newFiles = new ArrayList<File>();
        ArrayList<File> deletedFiles = new ArrayList<File>();

        // 追加されるファイルを検出
        for (File file : listOfFiles) {
            boolean containFlag = false;
            if (file.isFile()) {
                for (File file2 : loadedFiles) {
                    if (file.getName().equals(file2.getName())) {
                        containFlag = true;
                        break;
                    }
                }
            }
            if (!containFlag) {
                println(file.getName() + "が追加されました");
                newFiles.add(file);
            }
        }
        loadedFiles.addAll(newFiles);
        for (File file : newFiles) {
            if (file.isFile() && file.getName().endsWith(".png")) {
                ImageObjList.add(new ImageObj(loadImage(file.getAbsolutePath()), file.getName()));
            }
        }

        // 削除されるファイルを検出
        for (File file : loadedFiles) {
            boolean containFlag = false;
            if (file.isFile()) {
                for (File file2 : listOfFiles) {
                    if (file.getName().equals(file2.getName())) {
                        containFlag = true;
                        break;
                    }
                }
            }
            if (!containFlag) {
                println(file.getName() + "が削除されました");
                deletedFiles.add(file);
            }
        }
        loadedFiles.removeAll(deletedFiles);
        for (File file : deletedFiles) {
            ImageObjList.removeIf(ImageObj -> ImageObj.name.equals(file.getName()));
        }

        lastTime = currentTime; // 最後の時間を更新
    }
    
    for (ImageObj ImageObj : ImageObjList) {
        ImageObj.update();
        image(ImageObj.img, ImageObj.position.x, ImageObj.position.y, 40, 40);
    }
}

class ImageObj {
    PVector position;
    PImage img;
    String name;

    ImageObj(PImage img, String name) {
        position = new PVector(random(0, width), random(0, height));
        this.img = img;
        this.name = name;
    }

    void update() {
        position.x += random(-1, 1);
        position.y += random(-1, 1);
    }
}

Discussion