1

現在、 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) です。

次の質問のようないくつかの方法を探して試しましたが、この問題を解決できません。

いい案があれば教えてください。この問題に関する情報をいただければ幸いです。

4

1 に答える 1