Сохранение информации Geotag с фотографией на iOS4.1

У меня возникли серьезные проблемы, пытаясь сохранить фотографию в кадре с информацией о геотаге на iOS4.1. Я использую следующий API ALAssetsLibrary:

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

У меня есть координаты GPS, которые я хочу сохранить с фотографией в качестве входа. К сожалению, нет документа или примера кода, который описывает, как сформировать метаданные NSDictionary, которые инкапсулируют координаты GPS. Может кто-нибудь опубликовать пример кода, который, как известно, работает?

Я также попытался использовать библиотеку iPhone Exif для сохранения геоинформации в imageData вместо использования метаданных, но, к сожалению, библиотека iPhone Exif сбой. Любая помощь приветствуется.

Вот код для копирования всей доступной информации из объекта CLLocation в соответствующий формат для словаря метаданных GPS:

 - (NSDictionary *)getGPSDictionaryForLocation:(CLLocation *)location { NSMutableDictionary *gps = [NSMutableDictionary dictionary]; // GPS tag version [gps setObject:@"2.2.0.0" forKey:(NSString *)kCGImagePropertyGPSVersion]; // Time and date must be provided as strings, not as an NSDate object NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"HH:mm:ss.SSSSSS"]; [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; [gps setObject:[formatter stringFromDate:location.timestamp] forKey:(NSString *)kCGImagePropertyGPSTimeStamp]; [formatter setDateFormat:@"yyyy:MM:dd"]; [gps setObject:[formatter stringFromDate:location.timestamp] forKey:(NSString *)kCGImagePropertyGPSDateStamp]; [formatter release]; // Latitude CGFloat latitude = location.coordinate.latitude; if (latitude < 0) { latitude = -latitude; [gps setObject:@"S" forKey:(NSString *)kCGImagePropertyGPSLatitudeRef]; } else { [gps setObject:@"N" forKey:(NSString *)kCGImagePropertyGPSLatitudeRef]; } [gps setObject:[NSNumber numberWithFloat:latitude] forKey:(NSString *)kCGImagePropertyGPSLatitude]; // Longitude CGFloat longitude = location.coordinate.longitude; if (longitude < 0) { longitude = -longitude; [gps setObject:@"W" forKey:(NSString *)kCGImagePropertyGPSLongitudeRef]; } else { [gps setObject:@"E" forKey:(NSString *)kCGImagePropertyGPSLongitudeRef]; } [gps setObject:[NSNumber numberWithFloat:longitude] forKey:(NSString *)kCGImagePropertyGPSLongitude]; // Altitude CGFloat altitude = location.altitude; if (!isnan(altitude)){ if (altitude < 0) { altitude = -altitude; [gps setObject:@"1" forKey:(NSString *)kCGImagePropertyGPSAltitudeRef]; } else { [gps setObject:@"0" forKey:(NSString *)kCGImagePropertyGPSAltitudeRef]; } [gps setObject:[NSNumber numberWithFloat:altitude] forKey:(NSString *)kCGImagePropertyGPSAltitude]; } // Speed, must be converted from m/s to km/h if (location.speed >= 0){ [gps setObject:@"K" forKey:(NSString *)kCGImagePropertyGPSSpeedRef]; [gps setObject:[NSNumber numberWithFloat:location.speed*3.6] forKey:(NSString *)kCGImagePropertyGPSSpeed]; } // Heading if (location.course >= 0){ [gps setObject:@"T" forKey:(NSString *)kCGImagePropertyGPSTrackRef]; [gps setObject:[NSNumber numberWithFloat:location.course] forKey:(NSString *)kCGImagePropertyGPSTrack]; } return gps; } 

Назначьте словарь, возвращаемый этим методом, в качестве значения ключа kCGImagePropertyGPSDictionary в словаре метаданных, который вы передаете в writeImageDataToSavedPhotosAlbum:metadata:completionBlock: или CGImageDestinationAddImage() .

Я использовал этот код и создал NSMutableDictionary, чтобы помочь сохранить геотаг и другие метаданные изображения. Посмотрите мой блог здесь:

http://blog.codecropper.com/2011/05/adding-metadata-to-ios-images-the-easy-way/

После долгих поисков я нашел и адаптировал это

Это превращает данные cclocation в подходящий NSDictionary

  #import  +(NSMutableDictionary *)updateExif:(CLLocation *)currentLocation{ NSMutableDictionary* locDict = [[NSMutableDictionary alloc] init]; CLLocationDegrees exifLatitude = currentLocation.coordinate.latitude; CLLocationDegrees exifLongitude = currentLocation.coordinate.longitude; [locDict setObject:currentLocation.timestamp forKey:(NSString*)kCGImagePropertyGPSTimeStamp]; if (exifLatitude <0.0){ exifLatitude = exifLatitude*(-1); [locDict setObject:@"S" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef]; }else{ [locDict setObject:@"N" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef]; } [locDict setObject:[NSNumber numberWithFloat:exifLatitude] forKey:(NSString*)kCGImagePropertyGPSLatitude]; if (exifLongitude <0.0){ exifLongitude=exifLongitude*(-1); [locDict setObject:@"W" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef]; }else{ [locDict setObject:@"E" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef]; } [locDict setObject:[NSNumber numberWithFloat:exifLongitude] forKey:(NSString*) kCGImagePropertyGPSLongitude]; return [locDict autorelease]; } 

Затем я добавляю его в существующие метаданные, которые вы получаете через камеру (которая по умолчанию не имеет данных gps)

Я получаю оригинальные метаданные, подобные этому

 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ [imageMetaData setDictionary:[[info objectForKey:UIImagePickerControllerMediaMetadata] copy]]; } 

то я добавляю словарь gps, который производит предыдущий метод.

 [imageMetaData setObject:currentLocation forKey:(NSString*)kCGImagePropertyGPSDictionary]; [library writeImageToSavedPhotosAlbum:[viewImage CGImage] metadata:imageMetaData completionBlock:photoCompblock]; 

Вот вам удобная категория CLLocation на gist, чтобы сделать все это для вас:

https://gist.github.com/phildow/6043486

  • Как настроить цвет фона UITableViewCell?
  • Как нарисовать границу вокруг UILabel?
  • viewWillDisappear: Определяет, будет ли отображаться controller просмотра или показывается controller подзадачи
  • Выравнивание элементов UIToolBar
  • Можно ли изменить цвет фона UIButtons?
  • Образец кода WWDC 2010
  • iOS - нажимать вперед все
  • Как ввести значения RGB в Interface Builder?
  • Ограничить количество строк для UITextview
  • Как увеличить высоту UIProgressView
  • Как заставить UIMenuController работать для пользовательского представления?
  • Давайте будем гением компьютера.