2017-05-11 5 views
2

Ich versuche, die in einem JPEG-Bild enthaltenen Metadaten zu ändern. Es kann sich um eine der Metadaten im Bild handeln. In meinem Beispiel versuche ich, die Eigenschaft DateTimeDigitized in das aktuelle Datum zu ändern.Ändern von Bildmetadaten

Mein Code scheint größtenteils zu funktionieren, jedoch wird die set-Eigenschaft entfernt und nicht geändert. Ich bin nicht sicher, warum das passiert, kann mir jemand sagen, was ich falsch mache?

würde ich einen Rat Frameworks begrüßen, die die Aufgabe ausführen können helfen, aber ich würde vor allem interessieren, was ich mit diesem Ansatz falsch zu tun.

Ich führe diesen Code in einem Spielplatz, wo das Bild mit dem Namen "foo.jpg" im Pfad ~/Documents/Shared Playground Data/ gespeichert ist.

import Foundation 
import ImageIO   // CGImage functions 
import PlaygroundSupport 

let ImagePropertyExifDictionary = kCGImagePropertyExifDictionary as String 
let ImagePropertyExifDateTimeDigitized = kCGImagePropertyExifDateTimeDigitized as String 

func updateEXIFDateDigitized() { 
    // Create URL for source and destination 
    let sourceURL = playgroundSharedDataDirectory.appendingPathComponent("foo.jpg") as CFURL 
    let destinationURL = playgroundSharedDataDirectory.appendingPathComponent("bar.jpg") as CFURL 

    // Read source and get properties 
    guard 
    let sourceRef = CGImageSourceCreateWithURL(sourceURL, nil), 
    var metadata = CGImageSourceCopyPropertiesAtIndex(sourceRef, 0, nil) as? [String:Any] else { return } 

    print("unmodified properties", metadata, separator:"\n") 

    // Modify EXIF DateTimeDigitized property 
    guard var exif = metadata[ImagePropertyExifDictionary] as? [String:Any] else { return } 

    exif[ImagePropertyExifDateTimeDigitized] = Date() as CFDate 
    metadata[ImagePropertyExifDictionary] = exif as CFDictionary 
    print("", "modified properties", metadata, separator:"\n") 

    // Set up destination 
    guard let destinationRef = CGImageDestinationCreateWithURL(destinationURL, "public.jpeg" as CFString, 1, nil) else { return } 

    // Add image from source to destination with new properties 
    CGImageDestinationAddImageFromSource(destinationRef, sourceRef, 0, metadata as CFDictionary) 

    // Save destination 
    guard CGImageDestinationFinalize(destinationRef) else { return } 

    guard 
    let sourceRef2 = CGImageSourceCreateWithURL(destinationURL, nil), 
    let metadata2 = CGImageSourceCopyPropertiesAtIndex(sourceRef2, 0, nil) else { return } 

    print("", "saved properties", metadata2, separator:"\n") 
} 

updateEXIFDateDigitized() 

die entsprechenden Bits des Ergebnisses, entfernte ich die anderen Felder der Kürze:

unmodified properties 
{ 
    "{Exif}" =  { 
    DateTimeDigitized = "2007:07:31 17:42:01"; 
    DateTimeOriginal = "2007:07:31 17:42:01"; 
    }; 
} 

modified properties 
{ 
    "{Exif}" =  { 
    DateTimeDigitized = "2017-05-11 15:45:38 +0000"; 
    DateTimeOriginal = "2007:07:31 17:42:01"; 
    }; 
} 

saved properties 
{ 
    "{Exif}" =  { 
    DateTimeOriginal = "2007:07:31 17:42:01"; 
    }; 
} 
+0

Ich habe nach Wegen gesucht, EXIF-Daten für ein Jahr jetzt, aus und wieder zu ändern. Keine der Fragen, die ich auf SO bookmarkte, hatte Antworten. Aber heute habe ich eine Suche gemacht und das kam zurück - es gibt nicht wirklich die Aussage, dass man die geänderten Daten wirklich speichern kann, aber es kann dir trotzdem helfen. http://stackoverflow.com/questions/37992611/swift-how-to-modify-exif-info-in-images-taken-from-mobile-camera Lassen Sie mich hier wissen, wenn es tatsächlich funktioniert. – dfd

+0

@dfd Dieser Code funktioniert, um die Daten zu speichern, hatte ich das Format der Daten falsch, so wurde es gelöscht. Weitere Informationen finden Sie in meiner [Antwort] (http://stackoverflow.com/a/43929720/887210). – ColGraff

Antwort

2

ich das selbst beantworten, da ich herausgefunden, warum es nicht die Daten zu speichern wurde und es sieht Diese Frage kann anderen helfen.

Mein Code ist korrekt, das einzige Problem ist, dass ich das Datum nicht richtig formatiert habe. Da das Datum nicht im richtigen Format war, wurde es von den Frameworks gelöscht. Ich formatiert das Datum wie folgt und es gespeichert und angezeigt richtig:

exif[ImagePropertyExifDateTimeDigitized] = Date() as CFDate 

Der Ausgang wird nun (wieder beschnitten nur die relevanten Eigenschaften):

let formatter = DateFormatter() 
formatter.dateFormat = "yyyy:MM:dd HH:mm:ss" 
exif[ImagePropertyExifDateTimeDigitized] = formatter.string(from: Date()) 

Dieses anstelle der Linie war

unmodified properties 
    { 
    "{Exif}" =  { 
     DateTimeDigitized = "2007:07:31 17:42:01"; 
     DateTimeOriginal = "2007:07:31 17:42:01"; 
    }; 
} 

modified properties 
    { 
    "{Exif}" =  { 
     DateTimeDigitized = "2017:05:12 01:04:14"; 
     DateTimeOriginal = "2007:07:31 17:42:01"; 
    }; 
} 

saved properties 
    { 
    "{Exif}" =  { 
     DateTimeDigitized = "2017:05:12 01:04:14"; 
     DateTimeOriginal = "2007:07:31 17:42:01"; 
    }; 
}