问题
I'm struggling with getting the creation date from an image selected in the camera roll. Here is my code:
func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:NSDictionary!) {
var tmpImg = info[UIImagePickerControllerOriginalImage] as UIImage
var metaData: NSDictionary
var exifData: NSDictionary
let library = ALAssetsLibrary()
var dataJpeg: NSData
var url: NSURL = info.objectForKey(UIImagePickerControllerReferenceURL) as NSURL
library.assetForURL(url, resultBlock: {
(asset: ALAsset!) in
if asset != nil {
var image_representation : ALAssetRepresentation = asset.defaultRepresentation()
var iref : CGImage = assetRep.fullResolutionImage().takeUnretainedValue()
//How do I get DateTime from CGImage in Swift??
}
}, failureBlock: {
(error: NSError!) in
NSLog("Error!")
}
)
}
In an older Xcode Version with Objective-C I did this which works fine:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *chosenImage = info[UIImagePickerControllerOriginalImage];
//////////////////////////
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:[info objectForKey:UIImagePickerControllerReferenceURL]
resultBlock:^(ALAsset *asset) {
ALAssetRepresentation *image_representation = [asset defaultRepresentation];
// create a buffer to hold image data
uint8_t *buffer = (Byte*)malloc(image_representation.size);
NSUInteger length = [image_representation getBytes:buffer fromOffset: 0.0 length:image_representation.size error:nil];
if (length != 0) {
// buffer -> NSData object; free buffer afterwards
NSData *adata = [[NSData alloc] initWithBytesNoCopy:buffer length:image_representation.size freeWhenDone:YES];
// identify image type (jpeg, png, RAW file, ...) using UTI hint
NSDictionary* sourceOptionsDict = [NSDictionary dictionaryWithObjectsAndKeys:(id)[image_representation UTI] ,kCGImageSourceTypeIdentifierHint,nil];
// create CGImageSource with NSData
CGImageSourceRef sourceRef = CGImageSourceCreateWithData((__bridge CFDataRef) adata, (__bridge CFDictionaryRef) sourceOptionsDict);
// get imagePropertiesDictionary
CFDictionaryRef imagePropertiesDictionary;
imagePropertiesDictionary = CGImageSourceCopyPropertiesAtIndex(sourceRef,0, NULL);
// get exif data
CFDictionaryRef exif = (CFDictionaryRef)CFDictionaryGetValue(imagePropertiesDictionary, kCGImagePropertyExifDictionary);
NSDictionary *exif_dict = (__bridge NSDictionary*)exif;
NSString *creationdate=exif_dict[@"DateTimeOriginal"];
// clean up
CFRelease(imagePropertiesDictionary);
CFRelease(sourceRef);
}
else {
NSLog(@"image_representation buffer length == 0");
}
}
failureBlock:^(NSError *error) {
NSLog(@"couldn't get asset: %@", error);
}
];}
I'd be very grateful if someone could help me get the CreationDate out of the Image.
回答1:
based on Your code and How can I get image created date time or last modified date time from iOS Photos (like camera roll)?
this one works for me on XCode 6.1.1 for Swift:
func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:NSDictionary!) {
let library = ALAssetsLibrary()
var url: NSURL = info.objectForKey(UIImagePickerControllerReferenceURL) as NSURL
library.assetForURL(url, resultBlock: {
(asset: ALAsset!) in
if asset != nil {
//print the creation date
println(asset.valueForProperty(ALAssetPropertyDate))
}
}, failureBlock: {
(error: NSError!) in
NSLog("Error!")
}
)}
回答2:
Found the solution myself:
var image_representation : ALAssetRepresentation = asset.defaultRepresentation()
var iref : CGImage = image_representation.fullResolutionImage().takeUnretainedValue()
var metaData : NSDictionary = image_representation.metadata()
回答3:
here swift 3 code for checking creation date
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let library = ALAssetsLibrary()
let url: NSURL = info[UIImagePickerControllerReferenceURL] as! NSURL
library.asset(for: url as URL, resultBlock: { (asset: ALAsset?) in
if asset != nil {
//print the creation date
print(asset!.value(forProperty: ALAssetPropertyDate))
}
}, failureBlock: { (error: Error?) in
NSLog("Error \(error)")
})
}
来源:https://stackoverflow.com/questions/26462800/creation-date-from-camera-roll-image