【问题标题】:Adding or overwriting GPS metadata without losing any other data and save with PHPhotoLibrary添加或覆盖 GPS 元数据而不会丢失任何其他数据并使用 PHPhotoLibrary 保存
【发布时间】:2016-07-11 03:14:09
【问题描述】:

目前我正在从 ALAssetsLibrary 切换到 PHPhotoLibrary

我想在 JPEG 文件上添加或覆盖 GPS 元数据而不丢失任何其他数据。

使用 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 我不能做同样的事情。

我尝试通过添加或覆盖 GPS 元数据来创建 NSData(由 JPEG 文件制成)。 我可以使用 GPS 元数据创建和保存图像数据。 但它丢失了缩略图数据和其他数据(如制造商注释)。此外,文件大小([数据长度])从大约 5MB 减少到大约 3MB。

我使用 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 元数据之前/之后的文件大小几乎相同 (5MB)。

我查找并尝试了以下问题的几种方法,但它们无法解决此问题。

如果你有什么好主意,请告诉我。如有任何有关此问题的信息,我将不胜感激。

【问题讨论】:

    标签: ios objective-c gps metadata phphotolibrary


    【解决方案1】:

    我通过 TSI(技术支持事件)向 Apple 提出了这个问题。 但是他们没有给出明确的答案来解决这个问题。

    现在我决定在保存图像并添加位置信息时使用 ALAssetsLibrary 的 API。

    - (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多