X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=scripts%2Fsnapdiff.py;h=689898512acd75ff1e23b06ce2af2f5b09352d24;hb=HEAD;hp=857c0dfbdc00415435f69c3c947a1cec180381ae;hpb=ff1c0f2e00d211a38e52bfcddadb2771b0f63c2a;p=apitrace diff --git a/scripts/snapdiff.py b/scripts/snapdiff.py index 857c0df..6898985 100755 --- a/scripts/snapdiff.py +++ b/scripts/snapdiff.py @@ -39,10 +39,12 @@ import operator from PIL import Image from PIL import ImageChops from PIL import ImageEnhance +from PIL import ImageFilter thumb_size = 320, 320 +gaussian_kernel = ImageFilter.Kernel((3, 3), [1, 2, 1, 2, 4, 2, 1, 2, 1], 16) class Comparer: '''Image comparer.''' @@ -80,12 +82,16 @@ class Comparer: diff_im = Image.blend(self.src_im, diff_im, 0xcc/255.0) diff_im.save(diff_image) - def precision(self): + def precision(self, filter=False): if self.size_mismatch(): return 0.0 + diff = self.diff + if filter: + diff = diff.filter(gaussian_kernel) + # See also http://effbot.org/zone/pil-comparing-images.htm - h = self.diff.histogram() + h = diff.histogram() square_error = 0 for i in range(1, 256): square_error += sum(h[i : 3*256: 256])*i*i @@ -121,14 +127,13 @@ def surface(html, image): def is_image(path): - return \ - path.endswith('.png') \ - and not path.endswith('.diff.png') \ - and not path.endswith('.thumb.png') + name = os.path.basename(path) + name, ext1 = os.path.splitext(name) + name, ext2 = os.path.splitext(name) + return ext1 in ('.png', '.bmp') and ext2 not in ('.diff', '.thumb') def find_images(prefix): - prefix = os.path.abspath(prefix) if os.path.isdir(prefix): prefix_dir = prefix else: @@ -149,6 +154,10 @@ def main(): optparser = optparse.OptionParser( usage="\n\t%prog [options] ") + optparser.add_option( + '-v', '--verbose', + action="store_true", dest="verbose", default=False, + help="verbose output") optparser.add_option( '-o', '--output', metavar='FILE', type="string", dest="output", default='index.html', @@ -157,10 +166,18 @@ def main(): '-f', '--fuzz', type="float", dest="fuzz", default=0.05, help="fuzz ratio [default: %default]") + optparser.add_option( + '-a', '--alpha', + action="store_true", dest="alpha", default=False, + help="take alpha channel in consideration") optparser.add_option( '--overwrite', action="store_true", dest="overwrite", default=False, - help="overwrite") + help="overwrite images") + optparser.add_option( + '--show-all', + action="store_true", dest="show_all", default=False, + help="show all images, including similar ones") (options, args) = optparser.parse_args(sys.argv[1:]) @@ -182,31 +199,46 @@ def main(): html.write('\n') html.write(' \n') html.write(' \n') - html.write(' \n' % (ref_prefix, src_prefix)) + html.write(' \n' % (ref_prefix, src_prefix)) + failures = 0 for image in images: ref_image = ref_prefix + image src_image = src_prefix + image root, ext = os.path.splitext(src_image) delta_image = "%s.diff.png" % (root, ) if os.path.exists(ref_image) and os.path.exists(src_image): - if options.overwrite \ - or not os.path.exists(delta_image) \ - or (os.path.getmtime(delta_image) < os.path.getmtime(ref_image) \ - and os.path.getmtime(delta_image) < os.path.getmtime(src_image)): - - comparer = Comparer(ref_image, src_image) - comparer.write_diff(delta_image, fuzz=options.fuzz) - + if options.verbose: + sys.stdout.write('Comparing %s and %s ...' % (ref_image, src_image)) + comparer = Comparer(ref_image, src_image, options.alpha) + match = comparer.ae(fuzz=options.fuzz) == 0 + if match: + result = 'MATCH' + bgcolor = '#20ff20' + else: + result = 'MISMATCH' + failures += 1 + bgcolor = '#ff2020' + if options.verbose: + sys.stdout.write(' %s\n' % (result,)) html.write(' \n') - surface(html, ref_image) - surface(html, src_image) - surface(html, delta_image) + html.write(' \n' % (bgcolor, ref_image, image)) + if not match or options.show_all: + if options.overwrite \ + or not os.path.exists(delta_image) \ + or (os.path.getmtime(delta_image) < os.path.getmtime(ref_image) \ + and os.path.getmtime(delta_image) < os.path.getmtime(src_image)): + comparer.write_diff(delta_image, fuzz=options.fuzz) + surface(html, ref_image) + surface(html, src_image) + surface(html, delta_image) html.write(' \n') html.flush() html.write('
%s%sΔ
File%s%sΔ
%s
\n') html.write(' \n') html.write('\n') + if failures: + sys.exit(1) if __name__ == '__main__': main()