Python读取照片的Exif信息: 解锁图片背后的故事

news2024/11/25 0:25:57

60acfebc8860932a0a0e6c95bb6b7d41.jpeg

更多Python学习内容:ipengtao.com

大家好,我是涛哥,今天为大家分享 Python读取照片的Exif信息: 解锁图片背后的故事,文章2700字,阅读大约12分钟,大家enjoy~~

在数字摄影时代,我们拍摄的照片不仅是静态的图像,还包含了丰富的元数据,其中最重要的之一就是Exif信息。Exif(Exchangeable image file format)是一种用于储存照片元数据的标准格式,包含了拍摄设备、曝光时间、ISO感光度等详细信息。通过Python读取照片的Exif信息,能够深入了解每张照片背后的故事。

安装必要的库

首先,确保已经安装了Pillow库,它是Python Imaging Library(PIL)的一个友好分支,提供了强大的图像处理功能。

pip install Pillow

基础用法

通过以下示例代码,可以简单地读取一张照片的Exif信息。

from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS

def get_exif_data(image_path):
    image = Image.open(image_path)
    exif_data = image._getexif()
    if exif_data is not None:
        for tag, value in exif_data.items():
            tag_name = TAGS.get(tag, tag)
            print(f"{tag_name}: {value}")

# 读取照片的Exif信息
get_exif_data("sample.jpg")

Exif信息解析

Exif信息是一个包含各种标签的字典,其中每个标签都对应着不同的信息。为了更好地理解这些信息,可以通过ExifTags模块解析标签名称。

from PIL.ExifTags import TAGS

def decode_exif(exif):
    decoded_exif = {}
    for tag, value in exif.items():
        tag_name = TAGS.get(tag, tag)
        decoded_exif[tag_name] = value
    return decoded_exif

# 读取并解析Exif信息
exif_data = Image.open("sample.jpg")._getexif()
decoded_exif = decode_exif(exif_data)
print(decoded_exif)

GPS信息提取

对于包含GPS信息的照片,还可以提取并解析GPS相关的信息。

from PIL.ExifTags import GPSTAGS

def get_gps_info(image_path):
    image = Image.open(image_path)
    exif_data = image._getexif()
    if exif_data is not None and 34853 in exif_data:
        gps_info = exif_data[34853]
        decoded_gps = {}
        for tag, value in gps_info.items():
            tag_name = GPSTAGS.get(tag, tag)
            decoded_gps[tag_name] = value
        return decoded_gps
    else:
        return None

# 读取并解析GPS信息
gps_info = get_gps_info("sample.jpg")
print(gps_info)

实际应用场景

通过读取照片的Exif信息,可以在项目中应用各种场景,如自动整理照片库、提取拍摄设备信息、统计拍摄地点等。

以下是一个更为详细的应用场景,展示了如何利用Exif信息统计拍摄地点并生成可视化结果。

import os
from PIL import Image
import folium
from folium import plugins

def extract_gps_info(image_path):
    image = Image.open(image_path)
    exif_data = image._getexif()
    if exif_data is not None and 34853 in exif_data:
        gps_info = exif_data[34853]
        return gps_info
    else:
        return None

def generate_map(photo_folder):
    photo_map = folium.Map(location=[0, 0], zoom_start=2)
    
    for root, dirs, files in os.walk(photo_folder):
        for file in files:
            if file.lower().endswith(('.jpg', '.jpeg')):
                file_path = os.path.join(root, file)
                gps_info = extract_gps_info(file_path)
                
                if gps_info:
                    lat, lon = gps_info[2][0] + gps_info[2][1]/60 + gps_info[2][2]/3600, gps_info[4][0] + gps_info[4][1]/60 + gps_info[4][2]/3600
                    folium.Marker([lat, lon], popup=f"<img src='{file_path}' width='200px'>").add_to(photo_map)

    return photo_map

# 生成拍摄地点分布地图
result_map = generate_map("photo_library")
result_map.save("photo_map.html")

这个例子使用了folium库,通过解析照片的GPS信息,提取经纬度信息,并在地图上标记拍摄地点。这样的应用场景可以让用户更直观地了解照片的拍摄地点分布情况。

总结

通过读取照片的Exif信息,可以深入挖掘照片背后的故事。本文介绍了如何使用Python读取照片的Exif信息,并通过实际场景展示了其丰富的应用。通过分析Exif信息,可以获取拍摄时间、设备信息、甚至是GPS坐标。这为自动整理照片库、统计拍摄地点等应用场景提供了便捷的解决方案。特别是在拍摄地点统计的场景中,展示了如何将GPS信息转化为可视化的地图,使用户更直观地了解照片的拍摄分布情况。这为照片管理、旅行记录等提供了实用而有趣的工具。总体而言,通过深入理解和利用Exif信息,能够更好地管理和利用照片数据,为照片赋予更多的价值。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

8f3206ac84c5f47e0f476a6305767240.png

点击“阅读原文”,获取更多学习内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1260592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解Rabbit加密技术:原理、实现与应用

一、引言 在信息时代&#xff0c;数据安全愈发受到重视&#xff0c;加密技术作为保障信息安全的核心手段&#xff0c;得到了广泛的研究与应用。Rabbit加密技术作为一种新型加密方法&#xff0c;具有较高的安全性和便捷性。本文将对Rabbit加密技术进行深入探讨&#xff0c;分析…

什么是Cyclomatic Complexity循环复杂度

Cyclomatic Complexity&#xff0c;可以翻译成 循环复杂度圈复杂度圈复杂性回路复杂性 循环复杂度是软件工程中的一个定量度量&#xff0c;表示程序或函数的复杂性。它衡量程序源代码中线性独立路径或分支的数量。如果一个函数的循环复杂度太高了&#xff0c;就需要进行重构。…

如何使得HAL库STM32代码可以复制,重复使用

在上面这个代码使用标准库写的&#xff0c;但是这个方法可以放在HAL库代码里面没有问题&#xff0c; 如果所有引脚的初始化都是用CubeMX生成&#xff0c;那么只要引脚有变化&#xff0c;Hal库代码就每次都要使用CubeMX生成&#xff0c;而且因为引脚不确定导致要移植的代码不一…

计算机基础知识59

MySQL的卸载流程 1、先停止MySQL服务&#xff1a;右键“此电脑”&#xff0c;选择“管理”&#xff0c;之后选择“服务和应用程序”--“服务”&#xff0c;在服务中找到“MySQL”&#xff0c;右键选择“停止”。 2、找到“控制面板”--“程序和功能”&#xff0c;找到MySQL&…

[python]离线加载fetch_20newsgroups数据集

首先手动下载这个数据包 http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz 下载这个文件后和脚本放一起就行&#xff0c;然后 打开twenty_newsgroups.py文件&#xff08;在fetch_20newsgroups函数名上&#xff0c;右键转到定义即可找到&#xff09; 之后运行代码即…

SpringBoot监控Redis事件通知

Redis的事件通知 Redis事件通过 Redis 的订阅与发布功能&#xff08;pub/sub&#xff09;来进行分发&#xff0c; 因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下&#xff0c; 使用键空间通知功能。 因为 Redis 目前的订阅与发布功能采取的是发送即忘&am…

MySQL进阶-锁

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、语雀 、Github &#x1f389;公众号&#xff1a;猫十二懿 一、MySQL 锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、…

Excel如何比较两列数据的不同

当遇到exel有两个列表的数据&#xff0c;需要比较得到他们的不同的部分&#xff0c;并且得到一个不同的值的列表。示例如下&#xff1a; 目的是&#xff1a;通过比较&#xff0c;知道Column2的哪些值不在在Column1里。 WPS直接提供了这一个功能&#xff0c;如下图&#xff1a;…

基于Python获取亚马逊的评论信息的处理

文章目录 一、分析亚马逊的评论请求二、获取亚马逊评论的内容三、亚马逊评论信息的处理四、代码整合4.1 代理设置4.2 while循环翻页 总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具…

理解Android无埋点技术

首先什么是无埋点呢&#xff0c;其实所谓无埋点就是开发者无需再对追踪点进行埋码&#xff0c;而是脱离代码&#xff0c;只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码&#xff0c;而是尽可能的少写代码。开发者将SDK集…

策略算法与Actor-Critic网络

策略算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main 策略梯度 与前面的基于价值的算法不同&#xff0c;这类算法直接对策略本身进行近似优化。 在这种情况下&#xff0c;我们可以将策略描述成一个带有参数 θ θ θ的连续函数…

案例032:基于微信小程序的电子商城购物平台的设计与开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

软件测试回归测试流程

回归测试作为软件生命周期的一个组成部分&#xff0c;在整个软件测试过程中占有很大的工作量比重&#xff0c;软件开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中&#xff0c;新版本的连续发布使回归测试进行的更加频繁&#xff0c;而在极端编程方法中&#xff0…

堆的应用:堆排序

文章目录 前言堆排序的实现&#xff08;升序为例&#xff09;代码 前言 堆排序&#xff0c;顾名思义是一个利用堆来完成排序的一个操作。在之前&#xff0c;小编在[C语言学习系列–&#xff1e;【关于qsort函数的详解以及它的模拟实现】] 谈到冒泡排序&#xff0c;但是冒泡排序…

CAM-Classification activation map 类激活图玩耍指南

原始论文 Learning Deep Features for Discriminative Localization 衍生论文 代码实现 torch-cam 该项目把代码打包成为了一个库&#xff0c;我们可以直接调用&#xff1b; torchcam.methods 这是上面那个项目的文档说明&#xff1b;

FreeRTOS任务创建及细节

目录 任务创建 简化的TCB结构体 创建任务堆栈和任务TCB 初始化任务TCB的成员 初始化任务堆栈 把新任务添加到就绪列表 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName, /*lint !e971 Unqualified char types are allowed for …

Harmony入门-HelloWorld

HarmonyOS 已经出来一些时间了。也有了OpenHarmony&#xff0c;作为HarmonyOS抽离的基础架构OpenHarmony&#xff0c;贡献给开源了&#xff0c;后续独立出来&#xff0c;那可真是就要独立生态啦&#xff0c;咱们顺水行舟&#xff0c;学习学习。 1.IDE 安装 https://hmxt.org/d…

Aapche Dubbo 不安全的 Java 反序列化 (CVE-2019-17564)

漏洞描述 Apache Dubbo 是一个高性能的、基于 Java 的开源 RPC 框架。 Apache Dubbo 支持不同的协议&#xff0c;它的 HTTP 协议处理程序是 Spring Framework 的 .org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter Spring Framework 的安全警告显示&am…

VS2022 配置Qt编译环境 | winows安装Qt5.14.2 | VS2017和Qt5配置成功指南

Visual Studio 2022安装教程完文本内容较多,请耐心看完,挺有收获的,要自己多尝试哦。 文章目录 # 插件安装 如果你想用VS2022来创建QT项目,那么你首先要学会下面的操作,创建一个空白解决方案,在扩展搜索qt,并且下载两个插件(带有绿√的就是)。这里其实是一个坑:VS20…

福利来了| 200多款精选简历模板免费领,让你30秒内征服HR!

找工作是不是让你很头大&#xff1f;尤其是写简历&#xff0c;真的好痛苦啊&#xff01;我在网上找了好久&#xff0c;都没有找到合适的简历模板&#xff0c;自己做又不知道从哪里下手。 不过现在好了&#xff0c;有一个超级福利送给大家&#xff01;200多款精选简历模板免费领…