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

Processing中实现鼠标移动循环,重复图像去像素化的问题

问题解决:Processing图像去像素化后鼠标循环复位

问题分析

当前代码已实现图像随时间去像素化功能,但存在两个问题:

  • 去像素化完成后,鼠标无法回到初始位置并重复整个过程
  • 代码仅兼容Processing 2.2.1版本

代码修改方案

核心问题在于原代码的counter变量逻辑仅在鼠标超过窗口高度时复位,未关联去像素化完成的状态;且每次draw()循环新建Robot实例会造成资源浪费。修改后的代码如下:

import java.awt.Robot;
PImage img;
int pixls = 0;
int x, y, yinc;
int XOffset = 0;
int YOffset = 30;
int counter = YOffset;
Robot robot;

void setup() {
  size(900, 900);
  //noCursor();
  noStroke();
  img = loadImage("p.jpg");
  img.resize(900, 900);
  //surface.setLocation(XOffset, YOffset);
  
  // 初始化Robot实例,避免每次draw()重复创建
  try {
    robot = new Robot();
  } catch (Exception e) {
    println("Robot初始化错误: ", e);
  }
}

void draw() {
  loadPixels();
  frameRate(14);
  pixls = (int)map(mouseY, height, 20, 250, 20); // 像素化程度映射
  
  // 绘制像素化图像
  for (int i = 0; i < pixls; i++) {
    for (int j = 0; j < pixls; j++) {
      int pixelIndex = (height/pixls)*j*width + (width/pixls)*i;
      float r = red(img.pixels[pixelIndex]);
      float g = green(img.pixels[pixelIndex]);
      float b = blue(img.pixels[pixelIndex]);
      fill(r, g, b);
      rect((width/pixls)*i, (height/pixls)*j, width/pixls, height/pixls);
      yinc = (height/pixls)*j;
    }
  } 
  
  // 控制鼠标移动并循环复位
  if (robot != null) {
    robot.mouseMove(XOffset*2, counter);
    
    // 当鼠标到达底部,或去像素化完成(pixls=20)时,复位到初始位置
    if (counter > height + YOffset || pixls == 20) {
      counter = YOffset + 30; // +30 适配菜单栏高度
    }
    counter++; 
  }
}

修改说明

  • 将Robot实例初始化移至setup(),避免重复创建对象,提升运行效率
  • 调整鼠标复位触发条件:既保留原有的鼠标超出窗口高度复位逻辑,新增去像素化完成(pixls达到最小值20)时立即复位,确保流程循环执行
  • 提取像素索引为独立变量,提升代码可读性

注意:该代码仍仅兼容Processing 2.2.1版本,后续Processing版本对Java AWT的Robot类调用逻辑有变更。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:27:25