iOS 讀取修改圖片的Exif信息

1.Exif簡介

可交換圖像文件格式常被簡稱為Exif(Exchangeable image file format)哩掺,是專門為數(shù)碼相機(jī)的照片設(shè)定的,可以記錄數(shù)碼照片的屬性信息和拍攝數(shù)據(jù)涩笤。

Exif可以附加于JPEG嚼吞、TIFF、RIFF蹬碧、EXIF舱禽、GPS等文件之中,為其增加有關(guān)數(shù)碼相機(jī)拍攝信息的內(nèi)容和索引圖或圖像處理軟件的版本信息恩沽。

Exif信息以0xFFE1作為開頭標(biāo)記誊稚,后兩個(gè)字節(jié)表示Exif信息的長度。所以Exif信息最大為64 kB罗心,而內(nèi)部采用TIFF格式里伯。

2.讀取Exif信息

Exif信息是通過ImageIO框架來實(shí)現(xiàn)的,ImageIO框架在iOS中偏低層渤闷,所以提供的接口都是C風(fēng)格的疾瓮,關(guān)鍵數(shù)據(jù)也都是使用CoreFoundation進(jìn)行存儲(chǔ)。進(jìn)行數(shù)據(jù)的操作也就需要CoreFoundation和上層Foundation之間進(jìn)行橋接轉(zhuǎn)換肤晓。

1. 獲取圖片文件

NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"YourPic" withExtension:@""];

2.創(chuàng)建CGImageSourceRef

CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)fileUrl, NULL);

3.利用imageSource獲取全部ExifData

CFDictionaryRef imageInfo = CGImageSourceCopyPropertiesAtIndex(imageSource, 0,NULL);

4.從全部ExifData中取出EXIF文件

NSDictionary *exifDic = (__bridge NSDictionary *)CFDictionaryGetValue(imageInfo, kCGImagePropertyExifDictionary) ;

5.打印全部Exif信息及EXIF文件信息

NSLog(@"All Exif Info:%@",imageInfo);
NSLog(@"EXIF:%@",exifDic);

一張佳能相機(jī)拍攝的照片中的Exif信息:

All Exif Info:{
    ColorModel = RGB;
    DPIHeight = 200;
    DPIWidth = 200;
    Depth = 8;
    Orientation = 1;
    PixelHeight = 667;
    PixelWidth = 1000;
    ProfileName = "sRGB IEC61966-2.1";
    "{Exif}" =  {
        ApertureValue = "3.375";
        BodySerialNumber = 214014001512;
        ColorSpace = 1;
        ComponentsConfiguration =         (
            1,
            2,
            3,
            0
        );
        CustomRendered = 0;
        DateTimeDigitized = "2016:07:05 16:12:02";
        DateTimeOriginal = "2016:07:05 16:12:02";
        ExifVersion =         (
            2,
            3
        );
        ExposureBiasValue = 0;
        ExposureMode = 0;
        ExposureProgram = 3;
        ExposureTime = "0.0004";
        FNumber = "3.2";
        Flash = 16;
        FlashPixVersion =         (
            1,
            0
        );
        FocalLength = 168;
        FocalPlaneResolutionUnit = 2;
        FocalPlaneXResolution = "3545.827586206897";
        FocalPlaneYResolution = "3526.530612244898";
        ISOSpeedRatings =         (
            400
        );
        LensMake = "Canon 35mm f1.4";
        LensModel = "2016/09/21 11:04:31";
        LensSerialNumber = 0000c08f5f;
        LensSpecification =         (
            70,
            200,
            0,
            0
        );
        MeteringMode = 3;
        PixelXDimension = 1000;
        PixelYDimension = 667;
        RecommendedExposureIndex = 400;
        SceneCaptureType = 0;
        SensitivityType = 2;
        ShutterSpeedValue = "11.375";
        SubsecTime = 795;
        SubsecTimeDigitized = 30;
        SubsecTimeOriginal = 30;
        WhiteBalance = 0;
    };
    "{IPTC}" =     {
        DateCreated = 20160705;
        DigitalCreationDate = 20160705;
        DigitalCreationTime = 161202;
        TimeCreated = 161202;
    };
    "{JFIF}" =     {
        DensityUnit = 0;
        JFIFVersion =         (
            1,
            0,
            1
        );
        XDensity = 200;
        YDensity = 200;
    };
    "{TIFF}" =     {
        DateTime = "2016:07:08 16:45:32";
        Make = Canon;
        Model = "Canon EOS-1D X";
        Orientation = 1;
        ResolutionUnit = 2;
        Software = "ACDSee Pro 8";
        XResolution = 200;
        YResolution = 200;
    };
}

3.寫入Exif信息

1. 獲取圖片中的EXIF文件和GPS文件

NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"YourImage"], 1);

CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

NSDictionary *imageInfo = (__bridge NSDictionary*)CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);

NSMutableDictionary *metaDataDic = [imageInfo mutableCopy];
NSMutableDictionary *exifDic =[[metaDataDic objectForKey:(NSString*)kCGImagePropertyExifDictionary]mutableCopy];
NSMutableDictionary *GPSDic =[[metaDataDic objectForKey:(NSString*)kCGImagePropertyGPSDictionary]mutableCopy];

2. 修改EXIF文件和GPS文件中的部分信息

[exifDic setObject:[NSNumber numberWithFloat:1234.3] forKey:(NSString *)kCGImagePropertyExifExposureTime];
[exifDic setObject:@"SenseTime" forKey:(NSString *)kCGImagePropertyExifLensModel];
    
[GPSDic setObject:@"N" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef];
[GPSDic setObject:[NSNumber numberWithFloat:116.29353] forKey:(NSString*)kCGImagePropertyGPSLatitude];

[metaDataDic setObject:exifDic forKey:(NSString*)kCGImagePropertyExifDictionary];
[metaDataDic setObject:GPSDic forKey:(NSString*)kCGImagePropertyGPSDictionary];

3. 將修改后的文件寫入至圖片中

CFStringRef UTI = CGImageSourceGetType(source);
NSMutableData *newImageData = [NSMutableData data];
CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)newImageData, UTI, 1,NULL);

//add the image contained in the image source to the destination, overidding the old metadata with our modified metadata
CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metaDataDic);
CGImageDestinationFinalize(destination)爷贫;

4. 保存圖片

NSString *directoryDocuments =  NSTemporaryDirectory();
[newImageData writeToFile: directoryDocuments atomically:YES];

5. 查看修改后圖片的Exif信息

CIImage *testImage = [CIImage imageWithData:newImageData];
NSDictionary *propDict = [testImage properties];
NSLog(@"Properties %@", propDict);    

修改后的Exif信息:

Properties {
    ColorModel = RGB;
    Depth = 8;
    Orientation = 1;
    PixelHeight = 667;
    PixelWidth = 1000;
    ProfileName = "sRGB IEC61966-2.1";
    "{Exif}" =     {
        ColorSpace = 1;
        ExposureTime = "1234.3";
        LensModel = SenseTime;
        PixelXDimension = 1000;
        PixelYDimension = 667;
    };
    "{GPS}" =     {
        Latitude = "116.2935333333333";
        LatitudeRef = N;
    };
    "{JFIF}" =     {
        DensityUnit = 0;
        JFIFVersion =         (
            1,
            0,
            1
        );
        XDensity = 72;
        YDensity = 72;
    };
    "{TIFF}" =     {
        Orientation = 1;
    };
}

4.注意事項(xiàng)

關(guān)于無法修改Exif值的幾點(diǎn)注意事項(xiàng):

1. 傳入的數(shù)據(jù)格式與Exif規(guī)定的不符

Exif的每條信息都有對(duì)應(yīng)的數(shù)據(jù)類型认然,如:String Float... 如果數(shù)據(jù)類型傳入錯(cuò)誤將無法寫入文件。

2. 傳入的字段超過規(guī)定字段長度

3. 相互依賴的字段只添加了一個(gè)字段

在GPS文件中經(jīng)緯度的度數(shù)的字段與經(jīng)緯度的方向的字段相互依賴漫萄,修改經(jīng)/緯度數(shù)需要經(jīng)/緯方向字段的存在卷员,否則修改無效。

5.外部鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腾务,一起剝皮案震驚了整個(gè)濱河市毕骡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岩瘦,老刑警劉巖未巫,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異启昧,居然都是意外死亡叙凡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門密末,熙熙樓的掌柜王于貴愁眉苦臉地迎上來握爷,“玉大人,你說我怎么就攤上這事严里⌒绿洌” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵刹碾,是天一觀的道長燥撞。 經(jīng)常有香客問我,道長迷帜,這世上最難降的妖魔是什么物舒? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮戏锹,結(jié)果婚禮上茶鉴,老公的妹妹穿的比我還像新娘。我一直安慰自己景用,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布惭蹂。 她就那樣靜靜地躺著伞插,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盾碗。 梳的紋絲不亂的頭發(fā)上媚污,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音廷雅,去河邊找鬼耗美。 笑死京髓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的商架。 我是一名探鬼主播堰怨,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛇摸!你這毒婦竟也來了备图?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤赶袄,失蹤者是張志新(化名)和其女友劉穎揽涮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饿肺,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒋困,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敬辣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雪标。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖购岗,靈堂內(nèi)的尸體忽然破棺而出汰聋,到底是詐尸還是另有隱情,我是刑警寧澤喊积,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布烹困,位于F島的核電站,受9級(jí)特大地震影響乾吻,放射性物質(zhì)發(fā)生泄漏髓梅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一绎签、第九天 我趴在偏房一處隱蔽的房頂上張望枯饿。 院中可真熱鬧,春花似錦诡必、人聲如沸奢方。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟋字。三九已至,卻和暖如春扭勉,著一層夾襖步出監(jiān)牢的瞬間鹊奖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工涂炎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忠聚,地道東北人设哗。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像两蟀,于是被迫代替她去往敵國和親网梢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容