#!/usr/bin/python Import glob import OS import sys from PIL import Image exts = ' jpg ', ' jpeg ', ' jpg ', ' jpeg ', ' gif ', ' gif ', ' PNG ', ' PNG ' Def avhash (IM): If not isinstance (IM, image.image): im = Image.open (IM) im = Im.resize ((8, 8), Image.antialias). Convert (' L ') avg = reduce (lambda x, y:x + y, Im.getdata ())/64. return reduce (lambda x, (Y, Z): x | (z << y), Enumerate (map (lambda i:0 If i < avg else 1, im.getdata ())), 0) def hamming (H1, H2): h, d = 0, H1 ^ h2 while d:h + = 1 d &= d-1 return h if __ name__ = = ' __main__ ': If Len (SYS.ARGV) <= 1 or len (SYS.ARGV) > 3:print "Usage:%s image.jpg [dir]"% Sys.argv[0] Else:im, WD = Sys.argv[1], '. ' If Len (SYS.ARGV) < 3 else sys.argv[2] h = Avhash (IM) Os.chdir (wd) images = [] for ext in EXTS:images.extend (Glob.glob (' *.%s '%EXT)) seq = [] prog = int (len (images) > and Sys.stdout.isatty ()) for f in images: Seq.append (f, Hamming (Avhash (f), h))) If Prog:perc = 100. * Prog/len (IMAGES) x = Int (2 * perc/5) print ' \rcalculating ... [' + ' # ' * x + ' * (40-x) + '] ', print '%.2f%% '% perc, ' (%d/%d) '% (prog, len (images)), Sys.stdout.flush () Prog + = 1 if prog:print for F, ham in sorted (seq, KEY=LAMBDA I:I[1]): print "%d\t%s"% (Ham, f)
Go Wote written in Python language imghash.py