下面两篇文章介绍Exif

1.使用imageIO获取和修改图片的exif信息

2.读取照片的Exif信息

下面是第一篇

一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息。UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸,图片方向等。我们可以通过imageIO框架获取到图片背后的所有信息,下面就让我们一起看看。

一、获取图片信息

  imageIO框架是iOS中偏底层一点儿的框架,它内部提供的接口都是C风格的,关键数据也都是使用CoreFoundation进行存储。庆幸的是CoreFoundation中有很多数据类型都可以上层的数据Foundation框架中的数据类型进行无缝桥接。这也就大大方便了我们对图片信息的操作。

  CGImageSourceRef是整个imageIO的入口,通过它我们可以完成从文件的加载图片。加载完成以后我们就得到一个CGImageSourceRef,通过CGImageSourceRef我们就可以获取图片文件的大小,UTI(uniform type identifier),内部包含几张图片,访问每一张图片以及获取每张图片对应的exif信息等。

  你可能会有一个疑问,为什么会有几张图片呢?

  这块儿我解释一下,imageSourceRef和文件是一一对应的,通常我们见到的图片文件(例如jpg,png)内部都只有一张图片,这种情况我们通过CGImageSourceGetCount方法得到的就会是1。但是不能排除一个图片文件中会有多种图片的情况,例如gif文件,这个时候一个文件中就可能包含几张甚至几十张图片。前面我写的一片博客《IOS中如何解析并显示Gif》就是通过imageSource实现加载和解析gif的功能。

  下面是系统相机拍的照片的exif信息:

 Exif info

  从中我们可以看出最开始的几项分别显示了当前图片的颜色模式,色深,x,y方向的DPI,实际像素以及图片的方向。我最开始看到这个方向时,心中一喜这不是UIImage中的imageOrientation,但是实验发现这个方向和UIImage中的imageOrientation并不相等,此处的方向是exif标准定义的方向,从1到8分别对应这UIImage中的8个方向,只是顺序不一样,它们对应关系如下:

enum {exifOrientationUp = 1,      // UIImageOrientationUpexifOrientationDown = 3,    // UIImageOrientationDownexifOrientationLeft = 6,    // UIImageOrientationLeftexifOrientationRight = 8,   // UIImageOrientationRight// these four exifOrientation does not support by all camera, but IOS support these orientationexifOrientationUpMirrored = 2,          // UIImageOrientationUpMirroredexifOrientationDownMirrored = 4,        // UIImageOrientationDownMirroredexifOrientationLeftMirrored = 5,        // UIImageOrientationLeftMirroredexifOrientationRightMirrored = 7,       // UIImageOrientationRightMirrored
};
typedef NSInteger ExifOrientation;

  目前市面上的大部分数码相机和手机都会内置一个方向感应器,拍出的照片中会写如方向信息,但是通常都只会有前四种方向。这几种Mirrored方向通常都是手机前置摄像头自拍的时候才会设置。

  exif为什么要搞这么一个方向呢?

  几乎所有的摄像头在出场的时候成相芯片都是有方向的,拍出来的照片的像素都是默认方向的。如果每拍一张照片就对这些像素进行旋转,如果数码相机每秒连拍20张来算,旋转操作将会非常耗时。更聪明的做法是拍照时只记录一个方向,然后显示的时候按方向显示出来即可。因此exif定义了一个标准的方向参数,只要读图的软件都来遵守规则,加载时候读取图片方向,然后做相应的旋转即可。这样既可以达到快速成像的目的,又能达到正确的显示,何乐而不为呢。

  常见的图片浏览和编辑软件都遵守这个规则,但是有一个我们最常用的看图软件(windows自带的看图程序)不会去读这个方向,因此我们将数码相机和手机拍出来的图片导入windows上时,会经常遇到方向错误的问题。不知道windows帝国是怎么想的,或许和定义exif的组织有什么过节吧。

  图片信息中除了上面看提到的那些,还有拍摄的GPS信息,iOS自带的相册软件中的地点tab就是按照GPS信息实现的。还有很多其他的信息,感兴趣的可以自己写个程序研究研究,这里就不展开了。

二、修改图片exif信息

  我们除了可以通过CGImageSourceRef读取图片信息,还可以通过CGImageDestinationRef来创建图片文件,在创建的时候我们可以指定很多信息。例如我们可以通过CGImageDestinationRef来修改现有图片的GPS信息,图片方向,甚至还可以自己写一个制作gif的小工具。

  这块儿我做了个实验,通过修改图片信息的方向,来完成旋转图片的功能。原图方向为1(exif方向),我修改为3。保存后发现图片的确翻转过来了。于是更进一步想着试一下看看能不能完成90°旋转的功能,于是把图片方向改为6,保存后发现通过UIImage加载的图片显示出现问题了,虽然方向是转过来了,但是显示却被拉伸了。但是把保存后的图片存到系统相册,发现一切正常。  

  测试工程下载地址: https://github.com/smileEvday/SvImageInfo 

  注1: 文章中关于exif信息中图片方向的知识主要参考国外一个博客JPEG Rotation and EXIF Orientation,

读取照片的Exif信息相关推荐

  1. PHP如何读取照片的exif信息

    什么是Exif? Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的.实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白平衡.ISO.焦距.日期时 ...

  2. C# 读取照片的EXIF信息

    一.使用 MetadataExtractor 读取 EXIF 信息 1.NuGet 中安装 在 NuGet 中搜索并安装 MetadataExtractor: 2.包信息 我安装后会有两个包:Meta ...

  3. 通过Exiv2读取照片的Exif信息获取GPS,焦距等信息

    这里简单介绍一下如何通过开源C++工具包Exiv2读取图片中的属性信息 其实做这项工作之前也想偷懒百度一下的,大都是Java写的安卓的 ExifInterface 类,这和我的工作扯不上一点关系啊,最 ...

  4. 如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

    大家好,我是Lex 喜欢欺负超人那个Lex 上次,我们用Python读取照片的GPS信息,可以获取拍摄时间.手机型号等信息,还可以对 拍摄地点进行精确定位.Java表示不服~~~ 今日重点:用Java ...

  5. Java获取照片的Exif信息,并解析GPS

    Java获取照片的Exif信息,并解析GPS 1. 效果图 2. 什么是Exif? 3. 源代码 参考 ❤️ 这篇博客将介绍什么EXIF,以及如何用Java语言读取Exif信息,并转换经纬度为位置信息 ...

  6. MATLAB批量读取航摄相片EXIF信息和GNSS信息以及MATLAB批量经纬度坐标转换空间直角坐标

    前言 没有前言,创作不易,希望家人们点点赞,如有错误评论留言,感谢支持! 文章目录 前言 一.MATLAB批量读取航摄相片的EXIF信息,并批量提取其GNSS经纬度信息 (1)前述: (2)代码实现和 ...

  7. [转]数码照片的JPG文件高级信息(用C#读取图片的EXIF信息)

    [转]数码照片的JPG文件高级信息(用C#读取图片的EXIF信息) 数码相机的照片很多,而且文件名也不直观,所以写了个程序批量改名,就是把文件名都改成相机的拍照日期,呵呵,谁知道拍照日期不是那么好取, ...

  8. python读取图像的exif信息

    python读取图像的exif信息 python 读取图像的exif信息 import exifread PIL函数实现 python 读取图像的exif信息 前几天用PYQT做了一个工具,打开图片发 ...

  9. 获取照片的EXIF信息

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 背景概述 请利用Java编程技术获取手机拍摄的照片的EXIF信息,例如:拍摄时间.拍摄地点.经 ...

  10. python提取图片gps坐标,使用Python读取照片的GPS信息

    来源:https://www.cnblogs.com/baby123/p/12213794.html 昨天听人说,用手机拍照会带着GPS信息,原来没注意过这个,因此查看下并使用代码获取照片里的GPS信 ...

最新文章

  1. 负载均衡器技术 Nginx VS F5 Big-IP
  2. IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?
  3. tensorflow_yolo-v3笔记 IOU:Intersection over union 交并比
  4. python中协程与函数的区别_深入浅析python 协程与go协程的区别
  5. 大剑无锋之拦截器和过滤器的区别【面试推荐】
  6. 2020年进军 AI,想年薪 40 万,没这个能力不行
  7. TextureUnpacker 分割 Texturepacker 产生的图片 支持windows 和 mac
  8. python二元一次方程组用鸡兔同笼的思路来写编程_《应用二元一次方程组——鸡兔同笼》...
  9. 修改服务器的ip地址的命令,使用命令提示符更改IP地址和DNS服务器 | MOS86
  10. 鸿蒙系统是虚头,PS里如何分辨抠图用何种方法?
  11. 如何使用vps 异地组网_异地组网简要配置指南
  12. BZOJ5185: [Usaco2018 Jan]Lifeguards
  13. android9 apk自动安装功能,如何在Android7.0、8.0、9.0系统下通过Intent安装apk
  14. “爱运动管理系统”诞生记(4)
  15. 偏导数(Partial Derivative)
  16. php股票t+0,股票t文档教材+0操作宝典.pdf
  17. 小米9008授权 授权救砖 教程
  18. 星志远电商:拼多多头像如何保存?
  19. 数据库系统概论实验三——创建及管理数据表
  20. puzzle(0914)方块识途、拾穗方块

热门文章

  1. python windows开发环境_windows10下搭建Python3.6开发环境
  2. EXCEL文件转换PDF文件
  3. 量化交易实战【1】自己搭建一个的股票交易回测框架,并通过均线择时策略进行回测
  4. ftp服务器软件 性能对比,常用ftp服务器软件介绍
  5. 锯齿波调制的FMCW雷达中频回波信号的公式推导
  6. 如何防止别人QQ群话题发广告和批量QQ群发Q群话题
  7. 企业级网络架构(搭建)学习笔记(网管)
  8. k8s基本概念及使用
  9. GitHub仓库实现CICD快乐的总结嘤嘤嘤
  10. 计算机快捷键英语,输入法电脑中英文切换快捷键