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]")
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()