`
jsntghf
  • 浏览: 2541547 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

读取照片的Exif信息

    博客分类:
  • iOS
阅读更多

首先,将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;
    };
}
分享到:
评论

相关推荐

    用C#读取图片的EXIF信息的方法(读取照片ISO等信息原代码)

    摘要:本文讲述了使用 C# 读取图片的 EXIF 信息的方法,包括读取照片 ISO 感光度、曝光时间、快门速度、闪光灯、曝光模式、照片宽度、高度、f 值、曝光程序、光谱感知、EXIF 版本、色彩设置、压缩比率、光圈值、亮度...

    PHP中读取照片exif信息的方法

    总之,PHP读取照片EXIF信息是一个涉及多个步骤的过程,从了解EXIF信息开始,到安装必要的扩展模块,最后使用PHP内置的函数来读取和解析照片文件中的EXIF数据。这一系列动作允许开发者在Web应用程序中实现照片信息的...

    delphi xe 读取照片缩略图及EXIF信息源码

    这个源码示例是关于如何使用Delphi XE来读取照片的缩略图和EXIF信息,这对于图像处理或者照片管理软件的开发非常重要。 EXIF(Exchangeable Image File Format)是嵌入在JPEG或TIFF等图像文件中的元数据,包含拍摄...

    C++读取EXIF信息

    本项目提供了用C++编写的读取EXIF信息的类,使得开发者无需深入了解EXIF的复杂结构,就能方便地从图片文件中提取这些数据。下面我们将深入探讨这个类的实现原理和使用方法。 首先,C++类的设计通常包含构造函数、析...

    VB IPTC信息读取 VB EXIF信息读取

    以下是对VB IPTC和EXIF信息读取的详细解释: IPTC(International Press Telecommunications Council)信息是新闻摄影领域广泛使用的标准,用于存储图像的描述性信息。这些信息包括标题、作者、版权信息、关键词、...

    Exif信息显示插件 for dvbbs 7.1.0

    插件描述:用于论坛上传JPG... 主要功能: 1、上传文件时即可读取Exif信息并写入数据库,减少帖子显示时再读取Exif信息导致的页面拖延 2、支持论坛水印开启后的Exif信息显示 3、支持同时显示以往上传的文件显示Exif信息

    JAVA读取照片信息 exif

    通过以上步骤,你就能使用metadata-extractor库成功地从Java程序中读取照片的Exif信息了。这个强大的工具可以帮助开发者在处理图像时获取更多有价值的数据,无论是进行数据分析、图像编辑还是元数据管理,都能发挥...

    VC读取JPG照片Exif信息(VS2010编译通过)

    标题“VC读取JPG照片Exif信息(VS2010编译通过)”涉及的知识点主要集中在C++编程,特别是使用Visual Studio 2010(VS2010)开发环境,以及利用MFC(Microsoft Foundation Classes)框架处理JPEG图像的Exif...

    Andriod下读取图片Exif信息Demo

    在Android平台上,开发人员经常需要处理图像数据,其中包括读取图片的Exif信息。Exif(Exchangeable Image File Format)是一种扩展的JPEG格式,用于存储与图像相关的信息,如拍摄日期、时间、地理位置、相机型号、...

    Delphi读取Exif图像信息.rar

    Delphi读取Exif图像信息,搞图片或摄影的大概都知道Exif是什么吧,图像最原始的信息,一张只是不是合成的照片,只要是从数码相机中拍摄出来的照片,都会有EXIF信息,这里面记录了图像拍摄时的参数信息和图像属性信息...

    Exif信息读取

    综上所述,这个C++项目结合了Exif数据处理和Qt GUI编程技术,为用户提供了一种查看和理解照片Exif信息的工具。通过深入学习和实践,开发者不仅可以掌握Exif信息的读取方法,还能提升在C++和Qt上的技能。

    Delphi7下读取JPG文件Exif信息的类及示例,可以读取缩略图

    Delphi7写的读取JPEG文件Exif信息的类(含中文注释及Exif v2.3官方文档,含显示TIF格式的GraphicEx库) 支持JPEG格式的缩略图读取,TIF格式的暂时未遇到,不知正确与否。 记录为摩托罗拉CPU格式的Exif信息暂时未遇到...

    获取照片的Exif信息

    Exif信息通常包含了拍摄照片时的各种详细参数,如拍摄日期和时间、相机型号、曝光时间、光圈大小、ISO感光度、白平衡设置、地理位置等。这些信息对于摄影爱好者和专业摄影师来说非常有价值,因为他们可以据此调整...

    读取数码照片EXIF信息源码

    以下将详细介绍读取数码照片EXIF信息的相关知识点,并基于提供的源码文件"Exif.pas"进行解析。 首先,我们要知道读取EXIF信息需要用到特定的库或API,例如Java中的ImageIO,Python中的PIL(Pillow),或者是C++中的...

    照片自动分类归并,自动读取照片文件的exif信息.rar

    照片自动分类归并,自动读取照片文件的exif信息.rar

    vb6 编程 读取Exif 中的 拍摄日期 重命名照片文件名

    一个常用的库是"ImageMagick",它提供了Magick.NET组件,可以用来读取和操作Exif信息。首先需要安装ImageMagick,并在VB6项目中引用Magick.NET的DLL文件。 下面是一段示例代码,演示了如何使用Magick.NET读取Exif中...

    exif 的 C++ 读取类exif 的 C++ 读取类

    通过上述步骤,我们可以创建一个C++类,读取并解析数码照片中的EXIF信息,从而获取到关于照片的丰富元数据。这在图像处理、数据分析或开发摄影相关的应用程序时非常有用。当然,实际应用中还需要考虑性能优化、错误...

    Java读取照片地址完整项目【附测试照片一张】.zip

    项目中的核心部分是`ReadPicExif`类,它实现了读取照片EXIF信息的功能。这个类通常会包含以下关键步骤: 1. **加载图片**:使用`ImageIO.read()`方法从文件中读取图像,返回一个`BufferedImage`对象。 2. **获取元...

    ReadExifApp.rar

    纯 python 写的,批量读取照片的 Exif 信息(重点是GPS坐标)保存到 csv, xlsx 文件中的小程序,图形界面,操作简单。读取几千张照片,几分钟的事情。并且借鉴网友的算法尝试做了不同坐标系的转换。 下载压缩包,...

Global site tag (gtag.js) - Google Analytics