Java for循环无法终止问题:Processing代码循环异常重启求助
问题根源
Processing里的draw()函数是持续循环执行的(默认每秒60次),你把遍历目录处理图片的逻辑放在draw()里,就会导致每次draw触发时,整个for循环都重新跑一遍,看起来就是循环没完没了重启。
解决方案
有两种简单的修复方式:
方式1:把处理逻辑移到setup()中
setup()函数只会在程序启动时执行一次,完全符合你一次性处理所有图片的需求:
修改后的代码:
int dim = 1024; PImage img; String inDir; import java.util.*; import java.text.DecimalFormat; String outDir; String nameSpace; String nameSpaceOut; PGraphics pg; void setup() { size(1024, 1024); inDir = "C:/Users/Fynn/Desktop/processing-3.5.4/Resizematte/data/Input 1/"; outDir = "C:/Users/Fynn/Desktop/processing-3.5.4/Resizematte/data/Output 3/"; nameSpace = "ImageToResize"; pg = createGraphics(dim, dim); nameSpaceOut = "Resized"; // 把原来draw里的处理逻辑移到这里 background(0); pg.beginDraw(); File dir = new File(inDir); String[] filenames = dir.list(); // 先检查目录是否有效,避免空指针异常 if(filenames == null || filenames.length == 0){ println("目录为空或不存在"); return; } for (int i = 0; i < filenames.length; i++) { background(255, 255, 255); String fName = inDir + filenames[i]; img = loadImage(fName); if (img != null) { float w = img.width; float h = img.height; float m = w; float f = h; if (h > w) { //change to < for crop > for matte m = h; f = w; } float factor = (dim/m); if(h > w){ img.resize(int(f*factor), int(m*factor)); } else { img.resize(int(m*factor), int(f*factor)); } image(img, width/2-img.width/2, height/2-img.height/2); String outName1 = outDir + nameSpaceOut + "_" + i +".png"; save(outName1); } } // 处理完可以直接关闭窗口,或者保留显示 exit(); // 可选,执行完自动关闭Processing窗口 } // 空的draw函数,避免默认循环 void draw () { }
方式2:在draw里处理完后停止循环
如果你需要看到图片处理的可视化过程,可以保留draw,但在循环结束后调用noLoop()停止draw的重复执行:
修改draw函数部分:
void draw () { background(0); pg.beginDraw(); File dir = new File(inDir); String[] filenames = dir.list(); if(filenames == null || filenames.length == 0){ println("目录为空或不存在"); noLoop(); return; } for (int i = 0; i < filenames.length; i++) { // 原处理逻辑不变... } // 处理完成后停止draw循环 noLoop(); }
额外建议
- 每次处理图片时,最好加上
println("处理完成:" + filenames[i]),方便你跟踪进度 - 注意目录路径的斜杠,Processing也支持用
/或者转义的\\,你的写法没问题 - 检查输出目录是否存在,如果不存在可以用
new File(outDir).mkdirs()自动创建,避免保存失败
内容的提问来源于stack exchange,提问作者fynn leiber
相关产品推荐
相关产品推荐

