Color info added
This commit is contained in:
@@ -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)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user