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";
};
}
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
@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