8

Lo más extraño está sucediendo. Tengo una hoja de acción que le da al usuario la opción de tomar una foto con la cámara o elegir una del rollo de la cámara. Cuando el UIImagePicker regresa de la selección, uso ALAssetsLibrary para determinar la información del GPS incrustada en la foto. Elegir una foto del carrete de la cámara funciona perfectamente y puedo recuperar la información del GPS. Sin embargo, tomar una foto con la cámara no proporciona absolutamente ninguna información de GPS, de hecho no tengo ningún metadato en absoluto. ¿Alguien sabe lo que estoy haciendo mal aquí?La foto tomada con la cámara no contiene ningún metadato ALAsset

código de abajo

:

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

Como he explicado, el siguiente se da salida al utilizar la cámara.

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 

Sin embargo, si elijo una foto existente, o salir de la aplicación, tomar una foto con la cámara, y luego volver a entrar en la aplicación y selecciona esa foto del rollo de la cámara me sale el siguiente resultado de 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 - Estoy usando xCode 4.3 w/ARC

+0

Un par de respuestas que realmente funcionan están disponibles [aquí] (http://stackoverflow.com/questions/9766394/get-exif-data-from-uiimage-uiimagepickercontroller) – GreyHands

+0

he seguido esos ejemplos y Todavía estoy viviendo el mismo problema. ¿Podrías publicar algún código si sabes específicamente cuál es mi problema? Gracias por adelantado. – ElasticThoughts

+1

¿Ha activado servicios de ubicación de servicios de ubicación como sugiere el póster de respuesta aceptada? Parece que, en algunos casos, debe agregar metadatos de ubicación usted mismo. Lo cual no debería ser un problema si tiene activados los servicios de localización. –

Respuesta

13

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

probar este al guardar la foto

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

Esto debería marcarse como la solución correcta. Guarde una foto tomada desde la cámara al carrete de la cámara y luego puede usarla como suURL de activos para obtener metadatos ALAsset. –

+1

^No realmente. Mientras obtendrá el ALAsset de laURUR de activos en el bloque de finalización, valueForProperty: ALAssetPropertyLocation devolverá nulo. La única solución real para esto parece ser usar Core Location en la aplicación. –

0

@ Thanh Cong-Vo es correcta acerca de cómo para guardar la imagen en el álbum de fotos. Y ver lo que dice la Apples documents de salvar la imagen de álbum de fotos

Para guardar una imagen fija para álbum Carrete del usuario, llamar a la función UIImageWriteToSavedPhotosAlbum desde dentro del cuerpo del método imagePickerController:didFinishPickingMediaWithInfo:. Para guardar una película en el álbum Camera Roll del usuario, llame a la función UISaveVideoAtPathToSavedPhotosAlbum. Estas funciones, descritas en UIKit Function Reference, guardan solamente la imagen o la película; no guardan los metadatos.

A partir de iOS 4.0, puede guardar metadatos de imágenes fijas, junto con una imagen fija , en el Carrete de la cámara. Para ello, utilice el método writeImageToSavedPhotosAlbum:metadata:completionBlock: del marco de la biblioteca de activos . Consulte la descripción de la clave UIImagePickerControllerMediaMetadata.

Cuestiones relacionadas