欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

读取照片的Exif信息 博客分类: iOS iPhoneIOSExif 

程序员文章站 2024-02-14 19:14:58
...

首先,将AssetsLibrary.framework、CoreLocation.framework和ImageIO.framework加入到项目中。

 

PhotoLibViewController.h

 

#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>

@interface PhotoLibViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> {
    
}

- (IBAction)toGetImage:(id)sender;

@end

 

PhotoLibViewController.m

 

#import "PhotoLibViewController.h"
#import "PhotoLibImageInfoController.h"
#import "HHLocationManager.h"
#import <ImageIO/ImageIO.h>

@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 <UIKit/UIKit.h>

@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;
    };
}
相关标签: iPhone IOS Exif