You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:40:57