Writing a Photo with Metadata using Photokit

大城市里の小女人 提交于 2019-11-30 20:54:13

问题


I am currently using ALAsset framework for saving an image from Photo library to documents directory with metadata. The code I use is

ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
[library assetForURL:[NSURL URLWithString:miv.assetURL] resultBlock:^(ALAsset *asset) {
        ALAssetRepresentation *image_representation = [asset defaultRepresentation];
        CGImageSourceRef source = Nil;
        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)  {
          NSData *adata = [[NSData alloc] initWithBytesNoCopy:buffer length:image_representation.size freeWhenDone:YES];              
          NSDictionary* sourceOptionsDict = [NSDictionary dictionaryWithObjectsAndKeys:(id)[image_representation UTI] ,kCGImageSourceTypeIdentifierHint,nil];              
          // create CGImageSource with NSData
          source = CGImageSourceCreateWithData((__bridge CFDataRef) adata,  (__bridge CFDictionaryRef) sourceOptionsDict);              
        }
        NSDictionary *metadata = [image_representation metadata];
        NSMutableDictionary *metadataAsMutable = [metadata mutableCopy];
        NSMutableDictionary *EXIFDictionary = [metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary];
        NSMutableDictionary *GPSDictionary = [metadataAsMutable objectForKey:(NSString *)kCGImagePropertyGPSDictionary];
        if(!EXIFDictionary) {
          EXIFDictionary = [NSMutableDictionary dictionary];
        }
        if(!GPSDictionary) {
          GPSDictionary = [NSMutableDictionary dictionary];
        }
        [metadataAsMutable setObject:EXIFDictionary forKey:(NSString *)kCGImagePropertyExifDictionary];
        [metadataAsMutable setObject:GPSDictionary forKey:(NSString *)kCGImagePropertyGPSDictionary];
        CFStringRef UTI = CGImageSourceGetType(source);
        NSMutableData *dest_data = [NSMutableData data];
        CGImageDestinationRef destination CGImageDestinationCreateWithData((__bridge CFMutableDataRef)dest_data,UTI,1,NULL);                        
        CGImageDestinationAddImageFromSource(destination,source,0, (__bridge CFDictionaryRef) metadataAsMutable);
        BOOL success = NO;
        success = CGImageDestinationFinalize(destination);

        if(!success) {
        }
        [dest_data writeToFile:myImageFileName atomically:YES];
        CFRelease(destination);
        CFRelease(source);
}];

I want to convert this code to use Photo Kit. From my research I found the way Photo kit will handle a write is

PHFetchResult *savedAssets = [PHAsset fetchAssetsWithLocalIdentifiers:[NSArray arrayWithObjects:imageURLString, nil] options:nil];
[savedAssets enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
[[PHImageManager defaultManager]
     requestImageForAsset:(PHAsset *)asset
     targetSize:desiredSize
     contentMode:PHImageContentModeAspectFit
     options:Nil
     resultHandler:^(UIImage *result, NSDictionary *info) {
         // Write Here
         // The info here has no EXIF or Metadata. So get them
         PHContentEditingInputRequestOptions *editOptions =      
         [[PHContentEditingInputRequestOptions alloc]init];
         editOptions.networkAccessAllowed = YES;
         [asset requestContentEditingInputWithOptions:editOptions completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
             CIImage *image = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL];
             NSLog(@"metadata: %@", image.properties.description);
             ?? How do I write this to doc folder ?
       }];

     }
}

回答1:


I figured it out after some research. Here is how you save image to Document Directory with Exif.

PHFetchResult *savedAssets = [PHAsset fetchAssetsWithLocalIdentifiers:[NSArray arrayWithObjects:myAssetURL, nil] options:nil];
        [savedAssets enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
          PHImageRequestOptions *cropToSquare = [[PHImageRequestOptions alloc] init];
          cropToSquare.synchronous = YES;
          [[PHImageManager defaultManager] requestImageDataForAsset:asset
                                                            options:cropToSquare
                                                      resultHandler:
           ^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
             CIImage* ciImage = [CIImage imageWithData:imageData];
             NSMutableDictionary *metadataAsMutable = [ciImage.properties mutableCopy];
             CGImageSourceRef source = Nil;
             NSDictionary* sourceOptionsDict = [NSDictionary dictionaryWithObjectsAndKeys:dataUTI ,kCGImageSourceTypeIdentifierHint,nil];
             source = CGImageSourceCreateWithData((__bridge CFDataRef) imageData,  (__bridge CFDictionaryRef) sourceOptionsDict);
             CFStringRef UTI = CGImageSourceGetType(source);
             NSMutableData *dest_data = [NSMutableData data];
             CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)dest_data,UTI,1,NULL);
             CGImageDestinationAddImageFromSource(destination,source,0, (__bridge CFDictionaryRef) metadataAsMutable);
             BOOL success = NO;
             success = CGImageDestinationFinalize(destination);

             if(!success) {
             }
             [dest_data writeToFile:myTrumbImageFileName atomically:YES];
             CFRelease(destination);
             CFRelease(source);
           }];
        }];


来源:https://stackoverflow.com/questions/32102037/writing-a-photo-with-metadata-using-photokit

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