Processing中如何实现每帧从文件夹随机加载不同图片
Processing 每帧随机加载不同图片实现方案
这个需求完全可以实现,不过不推荐直接在draw()循环里实时调用loadImage(),磁盘IO操作会大幅拖慢渲染帧率,优先选择预加载所有图片到内存的方案,只有当图片数量过大内存放不下时再考虑动态加载的方案。
落地步骤
1. 素材准备
将所有需要调用的图片全部放入你的Processing项目的data文件夹中。
2. 最优方案:预加载所有图片(推荐)
提前在setup()阶段把所有图片加载到数组,draw()阶段直接从内存中随机调取,渲染无卡顿:
PImage[] imgList; int imgCount; // 如需避免连续出现相同图片,新增以下变量 int lastIndex = -1; void setup() { size(400, 400); // 读取data文件夹下所有文件 File folder = new File(dataPath("")); File[] files = folder.listFiles(); // 过滤出图片文件(可根据你的实际格式增减后缀判断) ArrayList<File> imgFiles = new ArrayList<File>(); for (File f : files) { String fileName = f.getName().toLowerCase(); if (fileName.endsWith(".jpeg") || fileName.endsWith(".jpg") || fileName.endsWith(".png")) { imgFiles.add(f); } } // 加载所有图片到数组 imgCount = imgFiles.size(); imgList = new PImage[imgCount]; for (int i = 0; i < imgCount; i++) { imgList[i] = loadImage(imgFiles.get(i).getName()); } } void draw() { int randomIndex; // 保证和上一张图片不一致,不需要该逻辑可以删掉do-while段 do { randomIndex = int(random(imgCount)); } while(randomIndex == lastIndex); lastIndex = randomIndex; image(imgList[randomIndex], 100, 100, 200, 200); }
特殊场景:图片数量过大需动态加载
如果你的图片数量太多,预加载占内存过高,可以选择每帧动态加载,性能会比预加载差:
ArrayList<String> imgFileNames = new ArrayList<String>(); PImage currentImg; void setup() { size(400, 400); // 先读取所有图片文件名存起来,不用加载图片本身 File folder = new File(dataPath("")); File[] files = folder.listFiles(); for (File f : files) { String fileName = f.getName().toLowerCase(); if (fileName.endsWith(".jpeg") || fileName.endsWith(".jpg") || fileName.endsWith(".png")) { imgFileNames.add(f.getName()); } } // 加载第一张图片 currentImg = loadImage(imgFileNames.get(int(random(imgFileNames.size())))); } void draw() { // 每帧随机选一个文件名加载 currentImg = loadImage(imgFileNames.get(int(random(imgFileNames.size())))); image(currentImg, 100, 100, 200, 200); }
内容的提问来源于stack exchange,提问作者drm17
相关产品推荐
相关产品推荐

