Allego la funzione che, sottolineo, è solo fatta per i miei problemi e non di uso generalizzato.
Legge e scrive solo alcune cose
Per le date ho scoperto che macchine foto diverse, usano campi diversi. Ho risolto (spero), con tentativi su varie chiavi
Codice: Seleziona tutto
def METADATI (nfile,modo,q=0,new=""):
# nfile : percorso foto formato .JPG
# modo : 'r' lettura 'w' scrittura (solo per q=1 o q=7)
# q : numero dato desiderato: o,1,2,3,7
# exif: 0: modello macch.foto 1 data creazione foto 2 risoluz. orizzontale
# 3 risoluz. verticale 7 commmenti (x info foto)
# new : per modo="w": nuovo dato se q=1 deve essere: aaaa-mm-gg hh:mm:ss
# << rc : 0:OK 1:file inesist. o no .JPG/jpg, 2:q errato 3:scritt.no 1 o 7 4:new con data irregol.
# << out : dato exif letto o scritto (new)
#----
# richiede: import pyexiv2
# guida utilizzo di pyexiv2: http://tilloy.net/dev/pyexiv2/doc/release-0.2.2/index.html
# nb: q=1 : se 'r' (data) infruttuosa, tenta con '4', poi con '9' e se ancora infruttuosa restituisce: 2000-01-01 00:00:00
# q=8 : in input prevede una stringa (no lista), in out gfornisce una stringa (no pseudo lista con [' ']
# esempio: datah=METADATI ("/..../foto.JPG","r",1) -> datah= -> aaaa-mm-gg hh:mm:ss
#+++++++++++++
def inout(q):
nn=ord(q)-48
key=tbc[nn][2:]
try: tag = metadata[key]; out=str(tag.value); out=out.strip()
except: out=""
return key,out
tbc=['0:Exif.Image.Model' # modello macchina foto 'r'
,'1:Exif.Photo.DateTime' # data creazione foto 'r' 'w'
,'2:Exif.Photo.PixelXDimension' # risoluz. orizzontale 'r'
,'3:Exif.Photo.PixelYDimension' # risoluz. verticale 'r'
,'4:Exif.Photo.DateTimeOriginal' # data creazione foto 'r'
,'5:' #
,'6:' #
,'7:Exif.Photo.UserComment' # usato x tipo foto 'r' 'w'
,'8:Iptc.Application2.Caption' # commenti gthumb 'r' 'w'
,'9:Exif.Image.DateTime' # data creazione foto 'r'
]
rc=0; out=""
try: metadata = pyexiv2.ImageMetadata(nfile); metadata.read()
except: rc=1
if nfile[-4:] <> ".JPG" and nfile[-4:] <> ".jpg": rc=1
if rc<>0:return rc,out
q=str(q)
if modo=="w":
if q <> '8': new=new.strip()
else: new=[new]
if q=='1':
if len(new)<>19 or new[4:5]<>'-' or new[7:8]<>'-' or new[10:11]<>' ' or new[13:14]<>':' or new[16:17]<>':': return 4,new
elif q=='8': pass
else: return 3,new
else:
if q not in '01234789': return 3,new
key,out=inout(q)
if modo=="r":
if q=='1':
if out=="" or out[0:4]=="0000":
key,out=inout('4')
if out=="" or out[0:4]=="0000":
key,out=inout('9')
if out=="": out="2000-01-01 00:00:00"
elif q=='8': out=out[2:-2]
return 0,out
else:
try: tag.value = new
except: metadata[key]=new
metadata.write()
return 0,new