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
相关产品推荐
相关产品推荐

