首先,将AssetsLibrary.framework、CoreLocation.framework和ImageIO.framework加入到项目中。
PhotoLibViewController.h
#import#import @interface PhotoLibViewController : UIViewController { } - (IBAction)toGetImage:(id)sender; @end
PhotoLibViewController.m
#import "PhotoLibViewController.h" #import "PhotoLibImageInfoController.h" #import "HHLocationManager.h" #import@implementation PhotoLibViewController - (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]; } - (void)dealloc { [super dealloc]; } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; } - (void)viewDidUnload { [super viewDidUnload]; } #pragma mark - IBAction - (IBAction)toGetImage:(id)sender { UIButton *button = (UIButton *)sender; UIImagePickerController *iconPickerController = [[UIImagePickerController alloc] init]; if (button.tag == 51) { iconPickerController.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; } else if (button.tag == 50) { iconPickerController.sourceType = UIImagePickerControllerSourceTypeCamera; iconPickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; iconPickerController.showsCameraControls = YES; } iconPickerController.delegate = self; [self presentModalViewController:iconPickerController animated:YES]; [[HHLocationManager shared] startStandardUpdates]; [iconPickerController release]; } #pragma mark UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; if (![mediaType isEqualToString:@"public.image"]) { return; } NSURL *imageURL = [info objectForKey:UIImagePickerControllerReferenceURL]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; CGImageRef imageRef = [[info objectForKey:UIImagePickerControllerOriginalImage] CGImage]; typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset); typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error); typedef void (^ALAssetsLibraryWriteImageCompletionBlock)(NSURL *assetURL, NSError *error); ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) { ALAssetRepresentation *rep = [myasset defaultRepresentation]; CGImageRef iref = [rep fullResolutionImage]; PhotoLibImageInfoController *imageInfo = [[PhotoLibImageInfoController alloc] initWithNibName:@"PhotoLibImageInfoController" bundle:nil]; imageInfo.image = [UIImage imageWithCGImage:iref]; imageInfo.imageInfo = [rep metadata]; NSLog(@"ALAssetRepresentation: %@", [rep metadata]); [self.navigationController pushViewController:imageInfo animated:YES]; [imageInfo release]; [library release]; }; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) { NSLog(@"Error, cant get image - %@", [myerror localizedDescription]); [library release]; }; ALAssetsLibraryWriteImageCompletionBlock completionblock = ^(NSURL *assetURL, NSError *error) { [library assetForURL:assetURL resultBlock:resultblock failureBlock:failureblock]; NSLog(@"Error, cant save image - %@", [error localizedDescription]); }; if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) { NSDictionary *gpsDict = [self updateExif:[[HHLocationManager shared] thisLocation]]; NSMutableDictionary *imageMetaData = [NSMutableDictionary dictionary]; [imageMetaData setObject:gpsDict forKey:(NSString *)kCGImagePropertyGPSDictionary]; [library writeImageToSavedPhotosAlbum:imageRef metadata:imageMetaData completionBlock:completionblock]; } else { [library assetForURL:imageURL resultBlock:resultblock failureBlock:failureblock]; } [picker performSelector:@selector(dismissModalViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES] afterDelay:1.0]; } @end
PhotoLibImageInfoController.h
#import@interface PhotoLibImageInfoController : UIViewController { } @property (nonatomic, retain) IBOutlet UIImageView *imageView; @property (nonatomic, retain) IBOutlet UITextView *info; @property (nonatomic, retain) NSDictionary *imageInfo; @property (nonatomic, retain) UIImage *image; @end
PhotoLibImageInfoController.m
#import "PhotoLibImageInfoController.h"
@implementation PhotoLibImageInfoController
@synthesize imageView, info, imageInfo, image;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
imageInfo = [[NSDictionary alloc] init];
image = [[UIImage alloc] init];
}
return self;
}
- (void)dealloc {
[image release];
[imageInfo release];
[imageView release];
[info release];
[super dealloc];
}
#pragma mark - View lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if (image)
self.imageView.image = image;
if (imageInfo)
self.info.text = [imageInfo description];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
@end
示例输出:
{
ColorModel = RGB;
DPIHeight = 100;
DPIWidth = 100;
Depth = 8;
PixelHeight = 120;
PixelWidth = 120;
"{Exif}" = {
ColorSpace = 1;
ComponentsConfiguration = (
1,
2,
3,
0
);
ExifVersion = (
2,
2,
1
);
FlashPixVersion = (
1,
0
);
PixelXDimension = 120;
PixelYDimension = 120;
SceneCaptureType = 0;
};
"{GPS}" = {
Latitude = "31.2795";
LatitudeRef = N;
Longitude = "120.7431666666667";
LongitudeRef = E;
};
"{TIFF}" = {
ResolutionUnit = 2;
XResolution = 100;
YResolution = 100;
"_YCbCrPositioning" = 1;
};
}