Добавление или перезапись метаданных GPS без потери других данных и сохранение с помощью PHPhotoLibrary

В настоящее время я перехожу с ALAssetsLibrary на PHPhotoLibrary.

Я хочу добавить или перезаписать метаданные GPS в файле JPEG без потери каких-либо других данных.

С ALAssetsLibrary мы могли бы сделать это, как показано ниже

- (void)saveImageDataToPhotoAlbum:(NSData *)originalData
{
    ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init];
    NSDictionary *dataDic = [self getMetaDataWithGps:originalData];

    [assetsLib writeImageDataToSavedPhotosAlbum:originalData
                                       metadata:[self getMetadataWithGpsInfo:originalData]
                                completionBlock:^(NSURL *url, NSError *e) {
                                    [self addToMyAlbum:url];
                                }];
}

- (NSDictionary *)getMetadataWithGpsInfo:(NSData *)originalData
{
    CGImageSourceRef cimage = CGImageSourceCreateWithData((CFDataRef)data, nil);
    NSDictionary *metadata = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(cimage, 0, nil);
    NSMutableDictionary *metadataAsMutable = [NSMutableDictionary dictionaryWithDictionary:metadata];

    metadataAsMutable[(NSString *)kCGImagePropertyGPSDictionary] = self.myGpsDic;

    [metadata release];  
    CFRelease(cimage);

    return metadataAsMutable;
}

Но с PHPhotoLibrary я не могу сделать то же самое.

Я попытался создать NSData (сделанный из файла JPEG) с добавлением или перезаписью метаданных GPS. Я мог создавать и сохранять данные изображений с метаданными GPS. Но он потерял данные эскизов и другие данные (например, заметку создателя). Кроме того, размер файла ([длина данных]) уменьшился примерно с 5 МБ до 3 МБ.

Мой код для создания данных изображения с метаданными GPS, как показано ниже,

- (NSData *)getDataWithGpsInfo:(NSData *)originalData
{
    CGImageSourceRef cimage = CGImageSourceCreateWithData((CFDataRef)data, nil);
    NSDictionary *metadata = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(cimage, 0, nil);
    NSMutableDictionary *metadataAsMutable = [NSMutableDictionary dictionaryWithDictionary:metadata];

    metadataAsMutable[(NSString *)kCGImagePropertyGPSDictionary] = self.myGpsDic;

    NSMutableData *dataWithLocationInfo = [NSMutableData data];
    CGImageDestinationRef dest =
        CGImageDestinationCreateWithData((CFMutableDataRef)dataWithLocationInfo, CGImageSourceGetType(cimage), 1, nil);
    CGImageDestinationAddImageFromSource(dest, cimage, 0, (CFDictionaryRef)metadataAsMutable);
    CGImageDestinationFinalize(dest);
    CFRelease(dest);

    [metadata release];  
    CFRelease(cimage);

    return dataWithLocationInfo;
}

В случае ALAssetsLibraray размер файла до / после добавления метаданных GPS почти такой же (5 МБ).

Я искал и пробовал несколько способов, таких как следующие вопросы, но они не могут решить эту проблему.

Если у вас есть хорошая идея, дайте мне знать. Буду признателен за любую информацию по этой проблеме.


person M.Masa    schedule 11.07.2016    source источник


Ответы (1)


Я задал этот вопрос Apple с TSI (инцидент технической поддержки). Но они не дали четкого ответа для решения вопроса.

Теперь я решил использовать API ALAssetsLibrary при сохранении изображения с добавлением информации о местоположении.

- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
person M.Masa    schedule 10.08.2016