課題
Processingで大量の画像を読み込んで処理したかったのだけど、標準のloadImage()を使おうとするとファイル数やファイル名が予め分かっていないといけない。つまり画像ファイルを追加したり削除したりすると、それに合わせてコードも修正しなければならない訳で、保守性も効率も悪い。
解決法
JavaにFilenameFilterというインターフェースがあるので、新しくクラスを作ってacceptメソッドをオーバーライドする。
import java.io.File; import java.io.FilenameFilter; public class PngFileFilter implements FilenameFilter { @Override public boolean accept(File directory, String fileName) { if(fileName.endsWith(".png")) { return true; } return false; } }
PngFileFilterクラスのインスタンスを作り、こんな感じでFileクラスのlistFilesメソッドに渡すと、".png"で終わるファイルが配列として返ってくる。ちなみにdataPath("")という関数を使うとdataフォルダまでのパスが取得できる。空の文字列を渡しているが、フォルダがある場合はその名前を指定できる。リファレンスに載っていないのである日突然なくなる可能性はある。
File[] imageFiles; PngFileFilter filter; void setup() { size(800, 800); filter = new PngFileFilter(); imageFiles = new File(dataPath("")).listFiles(filter); for(File file: imageFiles) { println(file.getName()); } }
RubyとかPythonだと特定のフォルダ以下のアセットを特定の拡張子で読み込むのが簡単なので、ああいう感じの書き方にできるとより便利。他の言語や環境から学ぶことは沢山ある。