python读取图像的exif信息
python读取图像的exif信息
- python 读取图像的exif信息
- import exifread
- PIL函数实现
python 读取图像的exif信息
前几天用PYQT做了一个工具,打开图片发现和原图像有一个转动的变化,后来发现是exif头的信息没有读取,当用open(“name.jpg”, ‘rb’) 以二进制流的形式打开图像,我们如何得到图像的exif信息呢?
import exifread
pip install exifread
导入exifread库,
f = open(filename, 'rb') tags = exifread.process_file(f)
如果你选择的图片有exif信息的话,打印一下tags会是一个字典类型,例如:
{"Image ImageDescription": (0x010E) ASCII= @ 18, "Image Make": (0x010F) ASCII=SONY @ 2266, "Image Model": (0x0110) ASCII=ILCE-6000 @ 2272, "Image Orientation": (0x0112) Short=Rotated 180 @ 54, "Image Software": (0x0131) ASCII=ILCE-6000 v3.20 @ 2282,"Image DateTime": (0x0132) ASCII=2015:01:13 04:27:23 @ 2298,"Image YCbCrPositioning": (0x0213) Short=Co-sited @ 90,"Image ExifOffset": (0x8769) Long=2318 @ 102,"Image SensitivityType": (0x8830) Short=Recommended Exposure Index @ 114,"Image RecommendedExposureIndex": (0x8832) Long=400 @ 126,"Image XPTitle": (0x9C9B) Byte=[0, 0] @ 138,"Image XPSubject": (0x9C9F) Byte=[32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, ... ] @ 42146,"Image LensSpecification": (0xA432) Ratio=[16, 50, 7/2, 28/5] @ 42210,"Image LensModel": (0xA434) ASCII=E PZ 16-50mm F3.5-5.6 OSS @ 42242,"Image PrintIM": (0xC4A5) Undefined=[80, 114, 105, 110, 116, 73, 77, 0, 48, 51, 48, 48, 0, 0, 3, 0, 2, 0, 1, 0, ... ] @ 42268,"Image Padding": (0xEA1C) Undefined=[] @ 206,"EXIF ExposureTime": (0x829A) Ratio=1/160 @ 4840,"EXIF FNumber": (0x829D) Ratio=28/5 @ 4848,"EXIF ExposureProgram": (0x8822) Short=Program Normal @ 2352,"EXIF ISOSpeedRatings": (0x8827) Short=400 @ 2364,"EXIF ExifVersion": (0x9000) Undefined=0230 @ 2376,"EXIF DateTimeOriginal": (0x9003) ASCII=2015:01:13 04:27:23 @ 4856,"EXIF DateTimeDigitized": (0x9004) ASCII=2015:01:13 04:27:23 @ 4876,"EXIF ComponentsConfiguration": (0x9101) Undefined=YCbCr @ 2412,"EXIF CompressedBitsPerPixel": (0x9102) Ratio=1 @ 4896,"EXIF BrightnessValue": (0x9203) Ratio=6917/1280 @ 4904,"EXIF ExposureBiasValue": (0x9204) Ratio=0 @ 4912,"EXIF MaxApertureValue": (0x9205) Ratio=159/32 @ 4920,"EXIF MeteringMode": (0x9207) Short=Pattern @ 2472,"EXIF LightSource": (0x9208) Short=Unknown @ 2484,"EXIF Flash": (0x9209) Short=Flash did not fire, auto mode @ 2496,"EXIF FocalLength": (0x920A) Ratio=50 @ 4928,"EXIF MakerNote": (0x927C) Undefined=[83, 79, 78, 89, 32, 68, 83, 67, 32, 0, 0, 0, 94, 0, 3, 16, 4, 0, 16, 0, ... ] @ 4936,"EXIF UserComment": (0x9286) Undefined=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] @ 42052,"EXIF SubSecTimeOriginal": (0x9291) ASCII=00 @ 2544,"EXIF SubSecTimeDigitized": (0x9292) ASCII=00 @ 2556,"EXIF FlashPixVersion": (0xA000) Undefined=0100 @ 2568,"EXIF ColorSpace": (0xA001) Short=sRGB @ 2580,"EXIF ExifImageWidth": (0xA002) Long=6000 @ 2592,"EXIF ExifImageLength": (0xA003) Long=3376 @ 2604,"Interoperability InteroperabilityVersion": (0x0002) Undefined=[48, 49, 48, 48] @ 42126,"EXIF InteroperabilityOffset": (0xA005) Long=42116 @ 2616,"EXIF FileSource": (0xA300) Undefined=Digital Camera @ 2628,"EXIF SceneType": (0xA301) Undefined=Directly Photographed @ 2640,"EXIF CustomRendered": (0xA401) Short=Normal @ 2652,"EXIF ExposureMode": (0xA402) Short=Auto Exposure @ 2664,"EXIF WhiteBalance": (0xA403) Short=Auto @ 2676,"EXIF DigitalZoomRatio": (0xA404) Ratio=1 @ 42136,"EXIF FocalLengthIn35mmFilm": (0xA405) Short=75 @ 2700,"EXIF SceneCaptureType": (0xA406) Short=Standard @ 2712,"EXIF Contrast": (0xA408) Short=Normal @ 2724,"EXIF Saturation": (0xA409) Short=Normal @ 2736,"EXIF Sharpness": (0xA40A) Short=Normal @ 2748,"EXIF Padding": (0xEA1C) Undefined=[] @ 2780,"EXIF OffsetSchema": (0xEA1D) Signed Long=4124 @ 2772
}
其中不同的key对应不同的信息,旋转信息在trags[‘Image Orientation’]中,打印出来是Rotated 180,说明旋转了180度,这样只需要在最后显示图片时预先调整一下就ok
另外在旋转90度时会出现两种 Rotated 90 CW 和 Rotated 90 CCW,第一种是顺时针旋转,第二种时逆时针旋转,Rotated 90 CCW 即为 270度。
PIL函数实现
如果使用PIL.Image类型的图像,我们可以用_getexif()函数实现,
def apply_exif_orientation(image):try:exif = image._getexif()except AttributeError:exif = Noneif exif is None:return imageexif = {PIL.ExifTags.TAGS[k]: v for k, v in exif.items() if k in PIL.ExifTags.TAGS}orientation = exif.get('Orientation', None)if orientation == 1:# do nothingreturn imageelif orientation == 2:# left-to-right mirrorreturn PIL.ImageOps.mirror(image)elif orientation == 3:# rotate 180return image.transpose(PIL.Image.ROTATE_180)elif orientation == 4:# top-to-bottom mirrorreturn PIL.ImageOps.flip(image)elif orientation == 5:# top-to-left mirrorreturn PIL.ImageOps.mirror(image.transpose(PIL.Image.ROTATE_270))elif orientation == 6:# rotate 270return image.transpose(PIL.Image.ROTATE_270elif orientation == 7:# top-to-right mirrorreturn PIL.ImageOps.mirror(image.transpose(PIL.Image.ROTATE_90))elif orientation == 8:# rotate 90return image.transpose(PIL.Image.ROTATE_90) else:return image
image 是PIL.Image类型的
本人小白,如果有错误之处,还望不吝指正。
python读取图像的exif信息相关推荐
- python 快速读取图像宽高信息
python 快速读取图像宽高信息 1. 背景 2. 方法 2.1 仅读取图像文件头部信息 2.2 采用特定 python 包读取 1. 背景 存在100w张JPG图像,需要获取它们的宽高信息.如果用 ...
- MATLAB批量读取航摄相片EXIF信息和GNSS信息以及MATLAB批量经纬度坐标转换空间直角坐标
前言 没有前言,创作不易,希望家人们点点赞,如有错误评论留言,感谢支持! 文章目录 前言 一.MATLAB批量读取航摄相片的EXIF信息,并批量提取其GNSS经纬度信息 (1)前述: (2)代码实现和 ...
- PHP如何读取照片的exif信息
什么是Exif? Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的.实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白平衡.ISO.焦距.日期时 ...
- Python读取安卓手机GPS信息
问题描述:使用Python读取安卓手机GPS信息,要求手机已经打开GPS. 思考一下: 1)如何在安卓手机上编写Python程序: 2)如何调用安卓系统提供的功能: 3)如何读取GPS数据. 思考上面 ...
- python读取日志匹配日志信息(二)
python读取日志匹配日志信息 一.绪论 1.python获取远程服务器上的日志(远程获取日志连接:python远程连接linux) 2.python读取服务器日志,进行分析获取到需要的数据 3.将 ...
- 图像处理基础 || (一) python 读取图像的常用方式
python 读取图像的常用方式 图像的读取与保存是图像处理或计算机视觉领域中最基本的操作,python中有众多的库支持图像的读取.显示与存储,常用的库包括 matplotlib.skimage 和 ...
- [Python开发] 使用python读取图片的EXIF
使用python读取图片的EXIF 方法 使用PIL.Image读取图片的EXIF. 使用https://pypi.python.org/pypi/ExifRead 读取图片的EXIF,得到EXIF标 ...
- python读取图像的几种方式
python读取图像的几种方式 本文介绍几种基于python的图像读取方式: 基于PIL库的图像读取.保存和显示 基于opencv-python的图像读取.保存和显示 基于matplotlib的图像读 ...
- [转]数码照片的JPG文件高级信息(用C#读取图片的EXIF信息)
[转]数码照片的JPG文件高级信息(用C#读取图片的EXIF信息) 数码相机的照片很多,而且文件名也不直观,所以写了个程序批量改名,就是把文件名都改成相机的拍照日期,呵呵,谁知道拍照日期不是那么好取, ...
最新文章
- TensorFlow 资源汇集
- Python的第一种数据类型——Number(数字)
- 关于 php mysql pdo cannot find driver 解决方案
- 介绍一款python类型检查工具pyright
- Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O
- 华软java_广州大学华软软件学院《Java程序设计》期末复习
- 关于AttachCurrentThread和DetachCurrentThread的故事
- 【AtCoder】ARC083
- 软件实习项目4——校园一卡通管理系统(代码实现)
- 常见的SQL面试题:经典50题(附详解)
- 矢量绘图软件:Sketch最新版82.1中文版
- 微信聊天记录做成词云~
- 任天堂如何通过旧技术赢得胜利
- 2022Android高级面试题汇总解答,2022-2022阿里巴巴安卓面试真题解析
- [趣味文学]“帅气”的莎士比亚
- 微信打不开链接怎么办,微信跳转外部浏览器打开
- 隐藏实用的GitHub使用技巧
- Matplotlib绘制三维数据点与线
- 使用记事本编写Java程序的运行步骤及乱码问题
- 自学SQL网习题题解:0-12(带内容解析!)
热门文章
- TYPE-C HUB拓展坞方案拆解
- 腾讯也发文执行“965”工作了,7点后加班需申请?
- python如何读取数据并输出为表格_Python 爬取数据并导出表格
- 快速计算梯度的魔法--反向传播算法
- SD vs SE in Ecology.
- 尽快溶入团队,打出自己的身价
- 区块链并不是什么都可解决的完美方案
- 为什么有人可以在屎一样混乱的几千行代码里加功能?不重构能驾驭屎山吗?...
- 前端-h5直播视频流(xgplayer 篇)
- ncnn/net.h: No such file or directory的解决方法