import java.awt.Point; import java.util.Queue; import java.util.LinkedList; PImage img; int tolerance; color fill_color; boolean allowed; void setup() { size(600, 400); img = loadImage("image.png"); fill_color = color(250, 0, 0); fill(0, 0, 100); tolerance = 15; image(img, 0, 0, width, height); textSize(18); text("Tolerance = "+tolerance+" (Use mouse wheel to change)", 100, height-30); text("Right click to reset", 100, height-10); } void draw() { if (allowed) { image(img, 0, 0, width, height); text("Tolerance = "+tolerance+" (Use mouse wheel to change)", 100, height-30); text("Right click to reset", 100, height-10); allowed = false; } } void mousePressed() { if (mouseButton == RIGHT) { img = loadImage("image.png"); } else { img.loadPixels(); flood(mouseX, mouseY); img.updatePixels(); allowed = true; } } void mouseWheel(MouseEvent event) { float e = event.getCount(); tolerance += 2*e; if (tolerance > 128) tolerance = 128; if (tolerance < 0) tolerance = 0; allowed = true; } void flood(int x, int y) { color target_color = img.pixels[pixel_position(mouseX, mouseY)]; if (target_color != fill_color) { Queue queue = new LinkedList(); queue.add(new Point(x, y)); while (!queue.isEmpty()) { Point p = queue.remove(); if (check(p.x, p.y, target_color)) { queue.add(new Point(p.x, p.y-1)); queue.add(new Point(p.x, p.y+1)); queue.add(new Point(p.x-1, p.y)); queue.add(new Point(p.x+1, p.y)); } } } } int pixel_position(int x, int y) { return x + (y * img.width); } boolean check(int x, int y, color target_color) { if (x < 0 || y < 0 || y >= img.height || x >= img.width) return false; int pp = img.pixels[pixel_position(x, y)]; boolean test_tolerance = (abs(green(target_color)-green(pp)) < tolerance && abs( red(target_color)- red(pp)) < tolerance && abs( blue(target_color)- blue(pp)) < tolerance); if (!test_tolerance) return false; img.pixels[pixel_position(x, y)] = fill_color; return true; }