// same brightness level count for each channel for now srecord noeq PosterizeBufferedImage(int brightnessLevels, BufferedImage img) is PixelPreservingImageOpResult { BufferedImage result; run { if (brightnessLevels >= 256 || img == null) ret with result = img; GrabbableIntPixels gp = grabbableIntPixels_fastOrSlow(img); int w = img.getWidth(), h = img.getHeight(), n = w*h; int[] pixels = gp.data; int[] pixels2 = new[n]; var posterizer = cachePosterizer(SinglePixelPosterizer(brightnessLevels)); int iOut = 0, iIn = gp.offset; for y to h: { for x to w: { int rgb = pixels[iIn+x]; pixels2[iOut++] = rgbInt( posterizer.get(rgbRed(rgb)), posterizer.get(rgbGreen(rgb)), posterizer.get(rgbBlue(rgb))); } iIn += gp.scanlineStride; } result = bufferedImageWithoutAlpha(w, h, pixels2); } public BufferedImage pixelPreservingSrcImage() { ret img; } BufferedImage get() { if (result == null) run(); ret result; } }