srecord noeq ImageDiffAsPNG(Rect r, byte[] pngData) is G2Drawable { public void drawOn(Graphics2D g) { var image = diffImage(); if (image != null) g.drawImage(image, r.x, r.y, null); } BufferedImage diffImage() { ret imageFromBytes(pngData); } *(BufferedImage img1, BufferedImage img2) { this(ImageDifferenceAsTransparentOverlay(img1, img2)); } *(ImageDifferenceAsTransparentOverlay diff) { r = diff.changedBounds(); if (!empty(r)) pngData = toPNG(clipBufferedImage(diff!, r)); } bool isEmpty() { ret main empty(r); } toString { ret isEmpty() ? "No change" : "Changed area: " + r + ", png bytes: " + n2(l(pngData)) + ", bits/pixel: " + formatDouble(bitsPerPixel(), 1); } double bitsPerPixel() { ret doubleRatio(l(pngData)*8L, area(r)); } }