ios - EXIF 数据不随图像一起保存?

标签 ios objective-c exif phphotolibrary

我想在特定相册中保存一些带有图像的字符串。 所以我使用了[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 添加 Assets 。

但是当我从相册中获取照片时,它没有 exif 数据。

我保存 EXIF 数据的代码在这里。请回答任何问题。

- (void)addImageToCameraRoll:(UIImage *)image didfinish:(NSString *)albumName {

    void (^saveBlock)(PHAssetCollection *assetCollection) = ^void(PHAssetCollection *assetCollection) {

        NSData* jpeg = UIImageJPEGRepresentation(image, 1.0f);

        CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef) jpeg, NULL);
        CFStringRef imageType = CGImageSourceGetType(source);
        NSDictionary *metadata = (NSDictionary *) CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, 0, NULL));
        NSMutableDictionary *metadataAsMutable = [metadata mutableCopy];

        NSMutableDictionary *EXIFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy];
        NSMutableDictionary *GPSDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyGPSDictionary]mutableCopy];

        if(!EXIFDictionary){
            //if the image does not have an EXIF dictionary (not all images do), then create one for us to use
            EXIFDictionary = [NSMutableDictionary dictionary];
        }

        if(!GPSDictionary){
            GPSDictionary = [NSMutableDictionary dictionary];
        }

        [GPSDictionary setValue:[NSNumber numberWithFloat:1.1] forKey:(NSString*)kCGImagePropertyGPSLatitude];
        [GPSDictionary setValue:[NSNumber numberWithFloat:2.2] forKey:(NSString*)kCGImagePropertyGPSLongitude];
        [EXIFDictionary setValue:@"my string to exif" forKey:(NSString *)kCGImagePropertyExifUserComment];
        [metadataAsMutable setObject:EXIFDictionary forKey:(NSString *)kCGImagePropertyExifDictionary];
        [metadataAsMutable setObject:GPSDictionary forKey:(NSString *)kCGImagePropertyGPSDictionary];

        NSMutableData *resultData = [NSMutableData data];
        CGImageDestinationRef imgDest = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)(resultData), imageType, 1, NULL);

        //copy image data
        CGImageDestinationAddImageFromSource(imgDest, source, 0, (CFDictionaryRef) metadataAsMutable);
        BOOL success = CGImageDestinationFinalize(imgDest);
        UIImage * image1 = [[UIImage alloc] initWithData:resultData];



        //Add assets
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                        PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image1];



                        PHObjectPlaceholder *assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset;
                        PHAssetCollectionChangeRequest *albumChangeRequest =
                        [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
                        [albumChangeRequest addAssets:@[ assetPlaceholder ]];

        }

                completionHandler:^(BOOL success, NSError *error) {
                         if (!success) {
                                NSLog(@"Error creating asset: %@", error);
                         }else{

                         }
                }];
    };


    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
    fetchOptions.predicate = [NSPredicate predicateWithFormat:@"localizedTitle = %@", albumName];

    PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];

    if (fetchResult.count > 0) {
        saveBlock(fetchResult.firstObject);
    }
    else {
        __block PHObjectPlaceholder *albumPlaceholder;
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:albumName];
            albumPlaceholder = changeRequest.placeholderForCreatedAssetCollection;

        } completionHandler:^(BOOL success, NSError *error) {
            if (success) {
                PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[albumPlaceholder.localIdentifier] options:nil];
                if (fetchResult.count > 0) {
                    saveBlock(fetchResult.firstObject);
                }
            } else {
                NSLog(@"Error creating album: %@", error);
            }
        }];
    }
}

我正在使用 PHImageManager 获取图像。

最佳答案

要使用照片框架保存照片细节,您必须将图像写入临时文件并使用 CGImageDestinationAddImage 将元数据添加到临时文件。

然后您可以使用[PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL]从临时文件中读取数据并将其保存到照片库中。

关于ios - EXIF 数据不随图像一起保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52829836/

相关文章:

ios - 将 NSInteger 转换为 NSIndexpath

python - 使用python,如何读取文件的 "date created"?

facebook - 在 Facebook 上查找照片的拍摄地点?

ios - 处理 iOS 麦克风输入并计算频率? ( swift )

ios - 如何拍照或挑选图像并传递给 VC

ios - 即使 focuspointofinterest 在 iPhone6 和 iPhone6+ 上发生变化,焦点也不会改变

ios - Double Tapped Gesture不能与addGestureRecognizer一起使用:

iphone - 如何开发自动错过的调用回复Messenger iOS移动应用程序

ios - Flutter TabBarView覆盖iOS设备中的底部区域(Slider)

python - 为什么我的 _getexif() 返回 None?