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信息相关推荐

  1. python 快速读取图像宽高信息

    python 快速读取图像宽高信息 1. 背景 2. 方法 2.1 仅读取图像文件头部信息 2.2 采用特定 python 包读取 1. 背景 存在100w张JPG图像,需要获取它们的宽高信息.如果用 ...

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

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

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

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

  4. Python读取安卓手机GPS信息

    问题描述:使用Python读取安卓手机GPS信息,要求手机已经打开GPS. 思考一下: 1)如何在安卓手机上编写Python程序: 2)如何调用安卓系统提供的功能: 3)如何读取GPS数据. 思考上面 ...

  5. python读取日志匹配日志信息(二)

    python读取日志匹配日志信息 一.绪论 1.python获取远程服务器上的日志(远程获取日志连接:python远程连接linux) 2.python读取服务器日志,进行分析获取到需要的数据 3.将 ...

  6. 图像处理基础 || (一) python 读取图像的常用方式

    python 读取图像的常用方式 图像的读取与保存是图像处理或计算机视觉领域中最基本的操作,python中有众多的库支持图像的读取.显示与存储,常用的库包括 matplotlib.skimage 和 ...

  7. [Python开发] 使用python读取图片的EXIF

    使用python读取图片的EXIF 方法 使用PIL.Image读取图片的EXIF. 使用https://pypi.python.org/pypi/ExifRead 读取图片的EXIF,得到EXIF标 ...

  8. python读取图像的几种方式

    python读取图像的几种方式 本文介绍几种基于python的图像读取方式: 基于PIL库的图像读取.保存和显示 基于opencv-python的图像读取.保存和显示 基于matplotlib的图像读 ...

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

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

最新文章

  1. TensorFlow 资源汇集
  2. Python的第一种数据类型——Number(数字)
  3. 关于 php mysql pdo cannot find driver 解决方案
  4. 介绍一款python类型检查工具pyright
  5. Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O
  6. 华软java_广州大学华软软件学院《Java程序设计》期末复习
  7. 关于AttachCurrentThread和DetachCurrentThread的故事
  8. 【AtCoder】ARC083
  9. 软件实习项目4——校园一卡通管理系统(代码实现)
  10. 常见的SQL面试题:经典50题(附详解)
  11. 矢量绘图软件:Sketch最新版82.1中文版
  12. 微信聊天记录做成词云~
  13. 任天堂如何通过旧技术赢得胜利
  14. 2022Android高级面试题汇总解答,2022-2022阿里巴巴安卓面试真题解析
  15. [趣味文学]“帅气”的莎士比亚
  16. 微信打不开链接怎么办,微信跳转外部浏览器打开
  17. 隐藏实用的GitHub使用技巧
  18. Matplotlib绘制三维数据点与线
  19. 使用记事本编写Java程序的运行步骤及乱码问题
  20. 自学SQL网习题题解:0-12(带内容解析!)

热门文章

  1. TYPE-C HUB拓展坞方案拆解
  2. 腾讯也发文执行“965”工作了,7点后加班需申请?
  3. python如何读取数据并输出为表格_Python 爬取数据并导出表格
  4. 快速计算梯度的魔法--反向传播算法
  5. SD vs SE in Ecology.
  6. 尽快溶入团队,打出自己的身价
  7. 区块链并不是什么都可解决的完美方案
  8. 为什么有人可以在屎一样混乱的几千行代码里加功能?不重构能驾驭屎山吗?...
  9. 前端-h5直播视频流(xgplayer 篇)
  10. ncnn/net.h: No such file or directory的解决方法