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]")
|
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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user