From 79f6437f78ac3c518615062278c85c8b1aa8bec0 Mon Sep 17 00:00:00 2001 From: ville rantanen Date: Sun, 29 Sep 2013 21:29:59 +0300 Subject: [PATCH] Color info added --- image_list.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/image_list.py b/image_list.py index 928087e..42a0d96 100755 --- a/image_list.py +++ b/image_list.py @@ -30,6 +30,10 @@ def setup_options(): help="Create randomized files for landscape and portrait images [%(default)s]") parser.add_argument("-s",type=str,dest="search",default=False, help="Search list based on path pattern") + parser.add_argument("--color",action="store_true",dest="colors",default=False, + help="Append list with mean color information This option will flip the 'Add new files' option. [%(default)s]") + parser.add_argument("--nearest",type=str,dest="nearestcolor",default=False, + help="Search list for nearest mean color. format: R,G,B in float 0-1. Add fourth value to limit search to number") parser.add_argument("--dup",action="store_true",dest="duplicate",default=False, help="Return a list of duplicate files, based on hashes. This option will flip the 'Add new files' option. [%(default)s]") parser.add_argument("--del",action="store_true",dest="deleteFiles",default=False, @@ -42,7 +46,7 @@ def setup_options(): options=parser.parse_args() BADDIRS.extend(options.exclude) - if options.duplicate or options.searchsmall: + if options.duplicate or options.searchsmall or options.colors: options.add=not options.add return options @@ -52,7 +56,8 @@ def createdb(sqlfile): conn.text_factory=str db.execute('CREATE TABLE list (id INTEGER PRIMARY KEY AUTOINCREMENT,\ file TEXT,date INTEGER,portrait NUMERIC, hash TEXT,\ - width INTEGER,height INTEGER)') + width INTEGER,height INTEGER,\ + R REAL,G REAL, B REAL, BR REAL, BG REAL, BB REAL)') conn.commit() return @@ -202,6 +207,60 @@ def get_dims(filename): out, err = p.communicate() return (out.strip().split('x')) +def append_colors(sqlfile): + conn=sqlite3.connect(sqlfile) + conn.text_factory=str + db=conn.cursor() + dbh=conn.cursor() + db.execute("SELECT file,R FROM list WHERE R IS NULL ORDER BY file") + i=0 + for row in db: + colors=get_colors(row[0]) + dbh.execute("UPDATE list SET R=?, G=?, B=?, BR=?, BG=?, BB=? \ + WHERE file=?",(colors[0][0],colors[0][1],colors[0][2], + colors[1][0],colors[1][1],colors[1][2],row[0])) + print "colors: %(f)s (%(r)s %(g)s %(b)s)" % {'f':row[0], 'r':colors[0][0], + 'g':colors[0][1], 'b':colors[0][2]} + i+=1 + if (i%50==0): + conn.commit(); + conn.commit() + return + +def find_color_nearest(sqlfile,src): + conn=sqlite3.connect(sqlfile) + conn.text_factory=str + db=conn.cursor() + src=[float(i) for i in src.strip().strip('"').split(',')] + if len(src)==3: + src.append(1) + db.execute("SELECT file, ABS(BR-?)+ABS(BG-?)+ABS(BB-?) as K,BR,BG,BB FROM list ORDER BY K LIMIT ?", + (src[0],src[1],src[2],src[3])) + for hit in db: + print "%(f)s : D %(d).2f (RGB %(r).2f,%(g).2f,%(b).2f)" % {'f':hit[0],'d':hit[1], + 'r':hit[2],'g':hit[3], 'b':hit[4]} + return + +def get_colors(filename): + small_args=['convert',filename+'[0]','-resize','10x10!','TEXT:-'] + p=subprocess.Popen(small_args,stdout=subprocess.PIPE) + img, err = p.communicate() + mean_args=['convert','-','-format','"%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]"','info:-'] + p=subprocess.Popen(mean_args,stdout=subprocess.PIPE,stdin=subprocess.PIPE) + mean, err = p.communicate(input=img) + mean_args=['convert','-', + '(','+clone','-gravity','North','-crop','10x1+0+0','-write','mpr:top','+delete',')', + '(','+clone','-gravity','South','-crop','10x1+0+0','-write','mpr:bot','+delete',')', + '(','+clone','-gravity','West','-crop','1x10+0+0','-rotate','90','-write','mpr:lef','+delete',')', + '(','+clone','-gravity','East','-crop','1x10+0+0','-rotate','90','-write','mpr:rig','+delete',')', + '+delete','mpr:top','mpr:bot','mpr:lef','mpr:rig','+append', + '-format','"%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]"','info:-'] + p=subprocess.Popen(mean_args,stdout=subprocess.PIPE,stdin=subprocess.PIPE) + border, err = p.communicate(input=img) + mean=[float(i) for i in mean.strip().strip('"').split(',')] + border=[float(i) for i in border.strip().strip('"').split(',')] + return (mean,border) + def searchdb(sqlfile,needle): conn=sqlite3.connect(sqlfile) conn.text_factory=str @@ -287,6 +346,8 @@ def find_smalls(minsize,sqlfile): flist.append(('smalls',smalls)) return flist + + def print_structure(files): for hash in files: #print(hash[0]) @@ -314,12 +375,18 @@ def main(): if options.search: print_structure(searchdb(options.sqlfile,options.search)) sys.exit(0) + if options.nearestcolor: + find_color_nearest(options.sqlfile,options.nearestcolor) + sys.exit(0) if options.delete: print('Deleting entries...') delete_nonexisting(options.sqlfile) if options.add or options.changed: print('Adding entries...') add_recurse(options) + if options.colors: + print('Adding colors...') + append_colors(options.sqlfile) if options.random: print('Random lists...') random_lists(options.sqlfile) @@ -338,5 +405,6 @@ def main(): sys.exit(0) -main() +if __name__ == "__main__": + main()