8

Das Seltsamste passiert. Ich habe ein Aktionsblatt, das dem Benutzer die Wahl gibt, entweder ein Foto mit der Kamera zu machen oder eines aus der Kamerarolle auszuwählen. Wenn der UIImagePicker von der Auswahl zurückkehrt, benutze ich die ALAssetsLibrary, um die GPS-Informationen zu bestimmen, die in das Foto eingebettet sind. Die Auswahl eines Fotos aus der Kamerarolle funktioniert einwandfrei und ich kann die GPS-Informationen abrufen. Allerdings macht das Fotografieren mit der Kamera absolut keine GPS-Informationen, tatsächlich habe ich überhaupt keine Metadaten. Weiß jemand was ich hier falsch mache?Das mit der Kamera aufgenommene Foto enthält keine ALAsset-Metadaten

-Code unten:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{  
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
    if([mediaType isEqualToString:(__bridge NSString *)kUTTypeImage]) 
    {   
     void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset) 
     { 
      // get images metadata 
      NSDictionary *metadata = asset.defaultRepresentation.metadata; 
      NSLog(@"Image Meta Data: %@",metadata); 

      // get coords 
      CLLocation *location = [asset valueForProperty:ALAssetPropertyLocation]; 
      NSLog(@"coordLat: %f , coordLon: %f", location.coordinate.latitude, location.coordinate.longitude); 

      // do more here - rest of code snipped to keep this question short 

    }; 
    NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL]; 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library assetForURL:assetURL 
      resultBlock:ALAssetsLibraryAssetForURLResultBlock 
      failureBlock:^(NSError *error) 
      { 
       // handle error 
      }]; 

    // rest of code snipped to keep this question short 

Wie ich bereits erklärt, wird die folgende ausgegeben werden, wenn die Kamera verwenden.

2012-04-15 17:58:28.032 MyApp[511:707] Image Meta Data: (null) 
2012-04-15 17:58:28.041 MyApp[511:707] coordLat: 0.000000 , coordLon: 0.000000 

Allerdings, wenn ich ein vorhandenes Foto, oder Ausfahrt aus dem App wählen, ein neues Foto mit der Kamera nehmen, dann in die App zurück und wählen Sie das Foto aus der Kamera Rolle i folgende Ausgabe von NSLog.

2012-04-15 17:57:03.286 MyApp[511:707] Image Meta Data: { 
ColorModel = RGB; 
DPIHeight = 72; 
DPIWidth = 72; 
Depth = 8; 
Orientation = 6; 
PixelHeight = 1936; 
PixelWidth = 2592; 
"{Exif}" =  { 
    ApertureValue = "2.970854"; 
    BrightnessValue = "2.886456"; 
    ColorSpace = 1; 
    ComponentsConfiguration =   (
     1, 
     2, 
     3, 
     0 
    ); 
    DateTimeDigitized = "2012:04:15 17:24:02"; 
    DateTimeOriginal = "2012:04:15 17:24:02"; 
    ExifVersion =   (
     2, 
     2, 
     1 
    ); 
    ExposureMode = 0; 
    ExposureProgram = 2; 
    ExposureTime = "0.06666667"; 
    FNumber = "2.8"; 
    Flash = 24; 
    FlashPixVersion =   (
     1, 
     0 
    ); 
    FocalLength = "3.85"; 
    ISOSpeedRatings =   (
     80 
    ); 
    MeteringMode = 5; 
    PixelXDimension = 2592; 
    PixelYDimension = 1936; 
    SceneCaptureType = 0; 
    SensingMethod = 2; 
    Sharpness = 2; 
    ShutterSpeedValue = "3.9112"; 
    SubjectArea =   (
     1295, 
     967, 
     699, 
     696 
    ); 
    WhiteBalance = 0; 
}; 
"{GPS}" =  { 
    Altitude = "14.9281"; 
    AltitudeRef = 0; 
    ImgDirection = "107.4554"; 
    ImgDirectionRef = T; 
    Latitude = "32.7366666666667"; 
    LatitudeRef = N; 
    Longitude = "71.679"; 
    LongitudeRef = W; 
    TimeStamp = "21:26:20.00"; 
}; 
"{TIFF}" =  { 
    DateTime = "2012:04:15 17:24:02"; 
    Make = Apple; 
    Model = "iPhone 4"; 
    Orientation = 6; 
    ResolutionUnit = 2; 
    Software = "5.0.1"; 
    XResolution = 72; 
    YResolution = 72; 
    "_YCbCrPositioning" = 1; 
}; 
} 
2012-04-15 17:57:03.302 MyApp[511:707] coordLat: 32.7366666666667 , coordLon: -71.679 

PS - Ich bin mit xCode 4.3 w/ARC

+0

Ein paar Antworten, die tatsächlich [hier] zur Verfügung arbeiten (http://stackoverflow.com/questions/9766394/get-exif-data-from-uiimage-uiimagepickercontroller) – GreyHands

+0

Ich habe diese Beispiele gefolgt und Ich habe immer noch das gleiche Problem. Könnten Sie Code für mich posten, wenn Sie genau wissen, was mein Problem ist? Danke im Voraus. – ElasticThoughts

+1

Haben Sie die Lokalisierungsdienste aktiviert, wie das Poster der angenommenen Antwort vermuten lässt? Es sieht so aus, dass Sie in einigen Fällen die Metadaten des Standorts selbst hinzufügen müssen. Dies sollte kein Problem sein, wenn Sie die Standortdienste aktiviert haben. –

Antwort

13

In - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

die Sie interessieren, wenn das Foto

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library writeImageToSavedPhotosAlbum:image.CGImage 
           metadata:[info objectForKey:UIImagePickerControllerMediaMetadata] 
          completionBlock:^(NSURL *assetURL, NSError *error) { 
     NSLog(@"assetURL %@", assetURL); 
    }]; 
+0

Dies sollte als die richtige Lösung markiert werden. Speichern Sie ein Foto, das Sie von der Kamera in die Kamera aufgenommen haben, und dann können Sie es als Ihre assetURL verwenden, um ALAsset-Metadaten zu erhalten! –

+1

^Nicht wirklich. Während Sie den ALAsset von der AssetURL im Completion-Block erhalten, gibt valueForProperty: ALAssetPropertyLocation nil zurück. Die einzige wirkliche Lösung scheint darin zu bestehen, Core Location in der App zu verwenden. –

0

@ Thanh Cong Vo sparen, ist richtig, wie um das Bild im Fotoalbum zu speichern. Und sieht, was die Apples documents sagt über Bild zu speichern zum Fotoalbum

Um ein Standbild des Camera Roll-Album des Benutzers zu speichern, rufen Sie die UIImageWriteToSavedPhotosAlbum Funktion aus dem Körper der imagePickerController:didFinishPickingMediaWithInfo: Methode. Um einen Film im Album "Camera Roll" des Benutzers zu speichern, rufen Sie stattdessen die Funktion UISaveVideoAtPathToSavedPhotosAlbum auf. Diese Funktionen, beschrieben in , speichern Sie das Bild oder Film nur; Sie speichern keine Metadaten.

Ab iOS 4.0 können Sie Standbild-Metadaten sowie ein Standbild, in die Filmrolle speichern. Verwenden Sie dazu die writeImageToSavedPhotosAlbum:metadata:completionBlock: Methode des Assets Library Framework. Siehe Beschreibung für den Schlüssel UIImagePickerControllerMediaMetadata.