EXIF Данные не сохраняются с изображением? - PullRequest
0 голосов
/ 16 октября 2018

Я хочу сохранить строку с изображением в конкретном альбоме.поэтому я использовал [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ для добавления ресурсов.

, но когда я получаю фотографии из альбома, в них нет данных 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 для получения изображений.

1 Ответ

0 голосов
/ 18 октября 2018

Чтобы сохранить детали с помощью Photo с помощью фоторамки, вы должны записать изображение во временный файл и добавить метаданные во временный файл, используя CGImageDestinationAddImage.

Затем вы можете прочитать данные из временного файла.и сохраните его в библиотеке фотографий с помощью [PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL] .

...