Creation Date from Camera Roll Image

一世执手 提交于 2020-01-02 23:07:11

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!