2016-07-11 4 views
0

Derzeit Wechsel von Ich bin über ALAssetsLibrary zu PHPhotoLibrary.Hinzufügen oder GPS-Metadaten zu überschreiben, ohne andere Daten zu verlieren und speichern mit PHPhotoLibrary

Ich möchte hinzufügen oder überschreiben GPS-Metadaten in JPEG-Datei ohne verlieren andere Daten.

Mit ALAssetsLibrary, wir könnten es tun, wie unten

- (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; 
} 

Aber mit PHPhotoLibrary Ich kann die gleiche Sache nicht.

Ich habe versucht, NSData (aus JPEG-Datei) mit dem Hinzufügen oder Überschreiben von GPS-Metadaten zu erstellen. I könnte erstellen und speichern Sie Bilddaten mit GPS-Metadaten. Aber es verloren Miniaturbilddaten und andere Daten (wie Maker Note). Außerdem wurde die Dateigröße ([Datenlänge]) von etwa 5 MB auf etwa 3 MB reduziert.

Mein Code Bilddaten zu erzeugen mit GPS-Metadaten wie unten ist,

- (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; 
} 

Bei ALAssetsLibraray, die Dateigröße vor/nach dem GPS-Metadaten hinzuzufügen, ist fast gleich (5 MB).

Ich suchte und versuchte mehrere Möglichkeiten wie die folgenden Fragen, aber sie können dieses Problem nicht lösen.

Wenn Sie eine gute Idee haben, lassen Sie es mich wissen. Ich würde mich über Informationen zu diesem Problem freuen.

Antwort

1

Ich habe diese Frage an Apple mit TSI (Technical Support Incident) gestellt. Aber sie gaben keine klare Antwort, um das Problem zu lösen.

Jetzt entscheide ich mich, die API von ALAssentsLibrary zu verwenden, wenn ich ein Bild mit zusätzlichen Ortsinformationen speichere.

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