cordova-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Junran (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CB-13950) All Exif data is stripped off under iOS when Camera.DestinationType is File_URI
Date Tue, 06 Mar 2018 23:10:00 GMT

    [ https://issues.apache.org/jira/browse/CB-13950?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16388676#comment-16388676
] 

Junran commented on CB-13950:
-----------------------------

I have changed the following function to keep the exif data when using File_URI, please use
or make change as you see fit, any other suggestion or improvement is most welcome too:

 

- (NSData*)processImage:(UIImage*)image info:(NSDictionary*)info options:(CDVPictureOptions*)options
{
    NSData* data = nil;

    switch (options.encodingType) {
        case EncodingTypePNG:
            data = UIImagePNGRepresentation(image);
            break;
        case EncodingTypeJPEG:
        {
            if ((options.allowsEditing == NO) && (options.targetSize.width
<= 0) && (options.targetSize.height <= 0) && (options.correctOrientation
== NO) && (([options.quality integerValue] == 100) || (options.sourceType != UIImagePickerControllerSourceTypeCamera))){
                // use image unedited as requested , don't resize
                data = UIImageJPEGRepresentation(image, 1.0);
            } else {
                data = UIImageJPEGRepresentation(image, [options.quality floatValue]
/ 100.0f);
            }

            //if (options.usesGeolocation) {
             NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];
 
            //NSDictionary *metadata =[info objectForKey:UIImagePickerControllerMediaMetadata];
            ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
            dispatch_semaphore_t sema = dispatch_semaphore_create(0);
            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

            dispatch_async(queue, ^{[library assetForURL:assetURL

                resultBlock:^(ALAsset *asset)  {

                    NSDictionary *controllerMetadata = asset.defaultRepresentation.metadata;
               
                    //NSLog(@"metadatacontrol %@", controllerMetadata);
            
                    //NSDictionary* controllerMetadata = [info objectForKey:@"UIImagePickerControllerMediaMetadata"];
                    if (controllerMetadata) {
                        self.data = data;
                        self.metadata = [[NSMutableDictionary alloc]
init];
                        NSMutableDictionary *metadataAsMutable = [controllerMetadata
mutableCopy];
                        //NSMutableDictionary* EXIFDictionary = [[metadataAsMutable
objectForKey:(NSString*)kCGImagePropertyExifDictionary]mutableCopy];
                        NSMutableDictionary *EXIFDictionary = [[metadataAsMutable
objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy];
                        NSMutableDictionary *GPSDictionary = [[metadataAsMutable
objectForKey:(NSString *)kCGImagePropertyGPSDictionary]mutableCopy];
                        NSMutableDictionary *RAWDictionary = [[metadataAsMutable
objectForKey:(NSString *)kCGImagePropertyRawDictionary]mutableCopy];

                        if(!EXIFDictionary)
                            EXIFDictionary = [[NSMutableDictionary
dictionary] init];

                        if(!GPSDictionary)
                            GPSDictionary = [[NSMutableDictionary
dictionary] init];

                        if(!RAWDictionary)
                            RAWDictionary = [[NSMutableDictionary
dictionary] init];

                        //Add the modified Data back into the image’s
metadata
                        [self.metadata setObject:EXIFDictionary forKey:(NSString
*)kCGImagePropertyExifDictionary];
                        [self.metadata setObject:GPSDictionary forKey:(NSString
*)kCGImagePropertyGPSDictionary];
                        [self.metadata setObject:RAWDictionary forKey:(NSString
*)kCGImagePropertyRawDictionary];

                        //NSLog(@"enter gpsdictionary %@", GPSDictionary);
                        //NSLog(@"enter exifdictionary %@", EXIFDictionary);
                        //NSLog(@"enter rawdictionary %@", RAWDictionary);

                        //NSLog(@"enter self.metadata %@", self.metadata);
                        if (self.metadata) {
                            //this will be the data CGImageDestinationRef
will write into
                            NSMutableData *newImageData = [NSMutableData
data];

                            CGImageSourceRef sourceImage = CGImageSourceCreateWithData((__bridge
CFDataRef)self.data, NULL);
                            CFStringRef sourceType = CGImageSourceGetType(sourceImage);

                            CGImageDestinationRef destinationImage
= CGImageDestinationCreateWithData((__bridge CFMutableDataRef)newImageData, sourceType, 1,
NULL);
                            CGImageDestinationAddImageFromSource(destinationImage,
sourceImage, 0, (__bridge CFDictionaryRef)self.metadata);
                            CGImageDestinationFinalize(destinationImage);

                            //CIImage *testImage = [CIImage imageWithData:newImageData];
                            self.data = newImageData;
                            CFRelease(sourceImage);
                            CFRelease(destinationImage);
                            dispatch_semaphore_signal(sema);
                        }
    
        
                        //if (EXIFDictionary)    {NSLog(@"enter
exifdictionary %@", EXIFDictionary);
                        //    [self.metadata setObject:EXIFDictionary
forKey:(NSString*)kCGImagePropertyExifDictionary];
                        //}

                        //if (IsAtLeastiOSVersion(@"8.0")) {
                         //   [[self locationManager] performSelector:NSSelectorFromString(@"requestWhenInUseAuthorization")
withObject:nil afterDelay:0];
                        //}
                        //[[self locationManager] startUpdatingLocation];
                    
                    
                    
                    }
                } failureBlock:^(NSError *error) {
                    dispatch_semaphore_signal(sema);
                }];
            });
            dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
            return self.data;
            //}
        }
            break;
        default:
            break;
    };

    return data;
}

> All Exif data is stripped off under iOS when Camera.DestinationType is File_URI
> -------------------------------------------------------------------------------
>
>                 Key: CB-13950
>                 URL: https://issues.apache.org/jira/browse/CB-13950
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: cordova-plugin-camera
>    Affects Versions: cordova-ios 4.5.0
>            Reporter: Junran
>            Priority: Major
>
> When Camera.DestinationType is File_URI 
> All exif metadata is stripped off under iOS
> This is inconsistent with what it is under Android. It seems the code have implemented
to reattached the exif metadata when writing to temporary file path, but it doesn't work.
> A way to retain the exif data when using File_URI under iOS is needed.
> Any idea is much appreciated. Thanks!



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@cordova.apache.org
For additional commands, e-mail: issues-help@cordova.apache.org


Mime
View raw message