Color info added

This commit is contained in:
ville rantanen
2013-09-29 21:29:59 +03:00
parent f9b0b52ebb
commit 79f6437f78

View File

@@ -30,6 +30,10 @@ def setup_options():
help="Create randomized files for landscape and portrait images [%(default)s]") help="Create randomized files for landscape and portrait images [%(default)s]")
parser.add_argument("-s",type=str,dest="search",default=False, parser.add_argument("-s",type=str,dest="search",default=False,
help="Search list based on path pattern") 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, 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]") 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, parser.add_argument("--del",action="store_true",dest="deleteFiles",default=False,
@@ -42,7 +46,7 @@ def setup_options():
options=parser.parse_args() options=parser.parse_args()
BADDIRS.extend(options.exclude) BADDIRS.extend(options.exclude)
if options.duplicate or options.searchsmall: if options.duplicate or options.searchsmall or options.colors:
options.add=not options.add options.add=not options.add
return options return options
@@ -52,7 +56,8 @@ def createdb(sqlfile):
conn.text_factory=str conn.text_factory=str
db.execute('CREATE TABLE list (id INTEGER PRIMARY KEY AUTOINCREMENT,\ db.execute('CREATE TABLE list (id INTEGER PRIMARY KEY AUTOINCREMENT,\
file TEXT,date INTEGER,portrait NUMERIC, hash TEXT,\ 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() conn.commit()
return return
@@ -202,6 +207,60 @@ def get_dims(filename):
out, err = p.communicate() out, err = p.communicate()
return (out.strip().split('x')) 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): def searchdb(sqlfile,needle):
conn=sqlite3.connect(sqlfile) conn=sqlite3.connect(sqlfile)
conn.text_factory=str conn.text_factory=str
@@ -287,6 +346,8 @@ def find_smalls(minsize,sqlfile):
flist.append(('smalls',smalls)) flist.append(('smalls',smalls))
return flist return flist
def print_structure(files): def print_structure(files):
for hash in files: for hash in files:
#print(hash[0]) #print(hash[0])
@@ -314,12 +375,18 @@ def main():
if options.search: if options.search:
print_structure(searchdb(options.sqlfile,options.search)) print_structure(searchdb(options.sqlfile,options.search))
sys.exit(0) sys.exit(0)
if options.nearestcolor:
find_color_nearest(options.sqlfile,options.nearestcolor)
sys.exit(0)
if options.delete: if options.delete:
print('Deleting entries...') print('Deleting entries...')
delete_nonexisting(options.sqlfile) delete_nonexisting(options.sqlfile)
if options.add or options.changed: if options.add or options.changed:
print('Adding entries...') print('Adding entries...')
add_recurse(options) add_recurse(options)
if options.colors:
print('Adding colors...')
append_colors(options.sqlfile)
if options.random: if options.random:
print('Random lists...') print('Random lists...')
random_lists(options.sqlfile) random_lists(options.sqlfile)
@@ -338,5 +405,6 @@ def main():
sys.exit(0) sys.exit(0)
main() if __name__ == "__main__":
main()