from collections import deque image_file = "image.png" fill_color = color(250, 0, 0) tolerance = 15 allowed = False def setup(): global img size(600, 400) img = loadImage(image_file) fill(0, 0, 100) textSize(18) show() def show(): image(img, 0, 0, width, height) text("Tolerance = {} (Use mouse wheel to change)".format(tolerance), 100, height - 30) text("Right click to reset", 100, height - 10) def draw(): global allowed if allowed: show() allowed = False def mousePressed(): global allowed, img if mouseButton == RIGHT: img = loadImage(image_file) else: img.loadPixels() flood(mouseX, mouseY) img.updatePixels() allowed = True def mouseWheel(event): global allowed, tolerance e = event.getCount() tolerance += 2 * e if tolerance > 128: tolerance = 128 if tolerance < 0: tolerance = 0 allowed = True def flood(x, y): target_color = img.pixels[pixel_position(mouseX, mouseY)] if target_color != fill_color: queue = deque() queue.append((x, y)) while len(queue) > 0: p_x, p_y = queue.popleft() if (check(p_x, p_y, target_color)): queue.append((p_x, p_y - 1)) queue.append((p_x, p_y + 1)) queue.append((p_x - 1, p_y)) queue.append((p_x + 1, p_y)) def pixel_position(x, y): return x + (y * img.width) def check(x, y, target_color): if x < 0 or y < 0 or y >= img.height or x >= img.width: return False pp = img.pixels[pixel_position(x, y)] test_tolerance = (abs(green(target_color) - green(pp)) < tolerance and abs(red(target_color) - red(pp)) < tolerance and abs(blue(target_color) - blue(pp)) < tolerance) if not test_tolerance: return False img.pixels[pixel_position(x, y)] = fill_color return True