рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЖрдИрдУрдПрд╕ рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд "рдлреЛрдЯреЛ" рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рддрд╕реНрд╡реАрд░реЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрди рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдкрд░ рднреА рдирд┐рд╢рд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпреЗ рддрд╕реНрд╡реАрд░реЗрдВ рд▓реА рдЧрдИ рдереАрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдорд╛рдирдХ рдХреИрдорд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлреЛрдЯреЛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЫрд╡рд┐ рдХреЗ рдЕрдВрджрд░ EXIF тАЛтАЛрдЯреИрдЧ рдореЗрдВ рдЖрдкрдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рди рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдПрдХ рдирдпрд╛ рдЪрд┐рд╣реНрди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдпрд╣ рдЫрд╡рд┐ рджреЛрд╕реНрддреЛрдВ рдХреЛ рднреЗрдЬреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдорджрдж рд╕реЗ, рд╣рд░ рдХреЛрдИ рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдЕрджреНрднреБрдд рд╢реЙрдЯ рдХрд╣рд╛рдБ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдм рдХреБрдЫ рд╕реБрдВрджрд░ рдФрд░ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реИред
рдпрд╣ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдп рд╕рдВрдХреЗрдд рдЖрдкрдХреЛ рддрдм рдорджрдж рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдХреИрдорд░рд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдПрдЧрд╛ рдФрд░ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ) рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрд╛рдЬрд╛ рддрд╕реНрд╡реАрд░реЗрдВ рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЕрдкрд▓реЛрдб рдХреА рдЬрд╛рдиреА рдереАрдВ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирдХреНрд╢реЗ рдкрд░ рдлрд╝реЛрдЯреЛ рдФрд░ рд╕реНрдерд╛рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред
рд╣рдо рддреАрди рдЫреЛрдЯреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдХреЗ, рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдХреИрдорд░реЗ рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
- рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ
- рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рд╕рдордиреНрд╡рдп рд▓рд┐рдЦреЗрдВ
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ - рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреИрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВред
рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (UIImagePickerController рд╕реЗ рдореБрдЭрд╕реЗ)
UIImage *pickedImage = [[info objectForKey:UIImagePickerControllerOriginalImage] retain];
рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реНрдерд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ (CLLocation рд╡рд░реНрдЧ рдХрд╛) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
CLLocationDegrees exifLatitude = location.coordinate.latitude; CLLocationDegrees exifLongitude = location.coordinate.longitude;
рд╣рдо рдЕрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ рдЬреЛ EXIF тАЛтАЛрдЯреИрдЧ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдПрдВрдЧреЗ
NSString *latRef; NSString *lngRef; if (exifLatitude < 0.0) { exifLatitude = exifLatitude * -1.0f; latRef = @"S"; } else { latRef = @"N"; } if (exifLongitude < 0.0) { exifLongitude = exifLongitude * -1.0f; lngRef = @"W"; } else { lngRef = @"E"; }
рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ:
kCGImagePropertyGPSTimeStamp
kCGImagePropertyGPSLatitude
kCGImagePropertyGPSLongitude
kCGImagePropertyGPSLatitudeRef
kCGImagePropertyGPSLongitudeRef
NSDictionary* locDict = [[NSDictionary alloc] initWithObjectsAndKeys: location.timestamp, (NSString*)kCGImagePropertyGPSTimeStamp, latRef, (NSString*)kCGImagePropertyGPSLatitudeRef, [NSNumber numberWithFloat:exifLatitude], (NSString*)kCGImagePropertyGPSLatitude, lngRef, (NSString*)kCGImagePropertyGPSLongitudeRef, [NSNumber numberWithFloat:exifLongitude], (NSString*)kCGImagePropertyGPSLongitude, nil];
рдПрдХ рдФрд░ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдПрдВ рдФрд░ рдКрдкрд░ рджреА рдЧрдИ рд░реЗрдЦрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕реНрдерд╛рди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдХреБрдВрдЬреА kCGImagePropertyGPSDictionary рд╣реИ
NSMutableDictionary *metadata = [[NSMutableDictionary alloc] init]; [metadata setObject:locDict forKey:(NSString*)kCGImagePropertyGPSDictionary]; [locDict release];
рд╣рдо NSData рдХреА рдПрдХ рдХрдХреНрд╖рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдЫрд╡рд┐ рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рднрд░рддреЗ рд╣реИрдВ
NSData *image = UIImageJPEGRepresentation(pickedImage, 90);
рдХреЛрдб рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рджреВ рд▓рд╛рдЗрдиреЗрдВ ALAssetsLibrary рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддреА рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреА рдлреЛрдЯреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдПрд▓реНрдмрдо рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ (рдФрд░ рди рдХреЗрд╡рд▓, рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдПрдХ рдлреЛрдЯреЛ рдПрд▓реНрдмрдо рдореЗрдВ рдлреЛрдЯреЛ рдХреЛ рд╕рд╣реЗрдЬреЗрдВред рд░рд╛рдЗрдЯрдореИрдЯрдбреЙрдЯрдЯреЙрд╡рдбреЗрдбрдлрд╝реЛрдЯреЛрдЖрд▓реНрдмрдо рд╡рд┐рдзрд┐ рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА рдФрд░ рд╕рд╛рде рд╣реА рд╣рдореЗрдВ рдЬрд┐рди EXIF тАЛтАЛрдЯреИрдЧреНрд╕ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦреЗрдЧрд╛ред
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library writeImageDataToSavedPhotosAlbum:image metadata:metadata completionBlock:^(NSURL *assetURL, NSError *error){ if (error) {
рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдлреЛрдЯреЛ рдПрд▓рдмрдо рдореЗрдВ рдПрдХ рддрд╕реНрд╡реАрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ рд╣рдо рдпрд╣рд╛рдБ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рд╣рдо рдЬрд┐рд╕ рдлрд╝реЛрдЯреЛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ dest_data рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ
NSMutableData *dest_data = [NSMutableData data];
рдлреЛрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдБ
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)image, NULL); if (!source) { NSLog(@"***Could not create image source ***"); }
рд╕рдВрдХреЗрдд рдкреНрд░рдХрд╛рд░
CFStringRef UTI = CGImageSourceGetType(source);
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╣рд╛рдБ рд▓рд┐рдЦрдирд╛ рд╣реИ (рдирд┐рдпрддрд┐_рдбреЗрдЯрд╛ рдореЗрдВ)
CGImageDestinationRef destination = CGImageDestinationCreateWithData((CFMutableDataRef)dest_data,UTI,1,NULL); if(!destination) { NSLog(@"***Could not create image destination ***"); }
рд╣рдо рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╢рдмреНрджрдХреЛрд╢ (рд╣рд╛рдВ, рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
CGImageDestinationAddImageFromSource(destination,source,0, (CFDictionaryRef) metadata); [metadata release];
рд╣рдо рдПрдХ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ
BOOL success = NO; success = CGImageDestinationFinalize(destination); if(!success) { NSLog(@"***Could not create data from image destination ***"); }
рдпрд╛рджрджрд╛рд╢реНрдд рд╕рд╛рдл рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ
CFRelease(destination); CFRelease(source);
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ dest_data рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдЫрд╡рд┐ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдкрдиреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ
#import <CoreFoundation/CoreFoundation.h> #import <AssetsLibrary/ALAssetsLibrary.h> #import <ImageIO/ImageIO.h>
рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
рдореЗрд░реЗ рдЕрдВрддрд╣реАрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП
рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред