2016-10-26 1 views
0

Mein Skript, das opencv verwendet, um Bilder zu drehen, wie sie sich befinden sollten, opencv tut dies automatisch, also ist es ziemlich einfach, das Bild über opencv zu öffnen und dann zu speichern.Scheinbar zufälliger Fehler beim Erstellen einer neuen Bilddatei

Ich übertrage dann die Exif-Header vom alten Bild auf das neue (mit pyexiv2) und lösche das alte Umbenennen der neuen Datei in das, was die alte Datei war.

Jedoch habe ich diesen scheinbar zufällige Fehler:

Traceback (most recent call last): 
    File "C:/Users/name/PycharmProjects/exif_data/test.py", line 28, in <module> 
    metadata.write() 
    File "C:\Users\name\AppData\Roaming\Python\Python27\site-packages\pyexiv2\metadata.py", line 119, in write 
    self._image._writeMetadata() 
IOError: C:\Users\name\Desktop\TEST\IMAGES\GIS\DUPLICATE.JPG5048: Failed to rename file to C:\Users\name\Desktop\TEST\IMAGES\GIS\DUPLICATE.JPG: File exists (errno = 17) 

doppelte doesnt existieren und auf Skript umbenannt jedes Mal, wird, sobald er es verlässt die Datei DUPLICATE.JPG5048 im Ordner fehlgeschlagen ist, gibt es eine Lösung? Oder fehlt mir etwas?

import numpy as np 
import cv2 
import pyexiv2 
import os 


directory = "C:\Users\name\Desktop\TEST\\IMAGES" 

for dirname, dirnames, filenames in os.walk(directory): 
print(dirname) 
for file in os.listdir(dirname): 
    if file.endswith(('.jpeg', '.jpg')) or file.endswith(('.JPEG', '.JPG')) : 
     filename, file_extension = os.path.splitext(directory+file) 
     oldFile = dirname+"\\"+file 
     newFile = dirname+"\\DUPLICATE"+file_extension 
     image = cv2.imread(oldFile) 
     cv2.imwrite(newFile, image) 
     m1 = pyexiv2.ImageMetadata(oldFile) 
     m1.read() 
     m1.modified = True # not sure what this is good for 
     m2 = pyexiv2.metadata.ImageMetadata(newFile) 
     m2.read() # yes, we need to read the old stuff before we can overwrite it 
     m1.copy(m2) 
     m2.write() 
     metadata = pyexiv2.ImageMetadata(newFile) 
     metadata.read() 
     print ', '.join(metadata.exif_keys) 
     metadata.write() 
     key = 'Exif.Image.Orientation' 
     value = 1 
     metadata[key] = pyexiv2.ExifTag(key, value) 
     os.remove(oldFile) 
     os.rename(newFile, oldFile) 
     del m1 
     del m2 
     del oldFile 
     del newFile 
+0

'einmal fehlgeschlagen'? Was war das für ein Versagen? – CAB

Antwort

0

Sie haben keine Ausnahmebehandlung, so dass, wenn ein Fehler auftritt, gibt es keine Chance, aufzuräumen. Versuchen Sie, try-catch hinzuzufügen. Das Folgende ist nicht sehr elegant. Sie könnten es verbessern, indem Sie die Handhabung für bestimmte Fehler hinzufügen.

import numpy as np 
import cv2 
import pyexiv2 
import os 

directory = "C:\Users\name\Desktop\TEST\\IMAGES" 

for dirname, dirnames, filenames in os.walk(directory): 
    print(dirname) 
    for file in os.listdir(dirname): 
    if file.endswith(('.jpeg', '.jpg')) or file.endswith(('.JPEG', '.JPG')) : 
     try: 
      filename, file_extension = os.path.splitext(directory+file) 
      oldFile = dirname+"\\"+file 
      newFile = dirname+"\\DUPLICATE"+file_extension 
      image = cv2.imread(oldFile) 
      cv2.imwrite(newFile, image) 
      m1 = pyexiv2.ImageMetadata(oldFile) 
      m1.read() 
      m1.modified = True # not sure what this is good for 
      m2 = pyexiv2.metadata.ImageMetadata(newFile) 
      m2.read() # yes, we need to read the old stuff before we can overwrite it 
      m1.copy(m2) 
      m2.write() 
      metadata = pyexiv2.ImageMetadata(newFile) 
      metadata.read() 
      print ', '.join(metadata.exif_keys) 
      metadata.write() 
      key = 'Exif.Image.Orientation' 
      value = 1 
      metadata[key] = pyexiv2.ExifTag(key, value) 
      os.remove(oldFile) 
      os.rename(newFile, oldFile) 
     except Exception as e: 
      print oldfile, 'not converted' 
      print str(e) 
      os.remove(newFile) # remove the partial new file 
Verwandte Themen