图片中的exif数据

  前两天python群中一位女神发了一张照片,虽然只是个风景照。但是我突然想起之前在读 <<python绝技>> 时书中有讲到在图片中包含exif(exchange image file format),exif标准定义了如何存储图片和音频文件的标准,包含文档的作者,修改时间甚至有可能包含照片的GPS位置信息。(事实上不止图片,文档,表格,音频,视频都有类似exif的元数据)。

    from PIL import Image
    from PIL.ExifTags import TAGS
    img = Image.open(r"1.jpg")
    for tag,value in img._getexif().items():
        print(TAGS.get(tag,tag),value)
程序运行结果如下:
    (‘ImageWidth‘, 5312)
    (‘ImageLength‘, 2988)
    (‘JpegIFByteCount‘, 0)
    (‘WhiteBalance‘, 0)
    (‘UserComment‘, u‘\n‘)
    (‘MeteringMode‘, 65535)
    (‘LightSource‘, 0)
    (‘Flash‘, 0)
    (‘FocalLength‘, (480, 100))
    (‘Orientation‘, 0)
    (‘Make‘, u‘samsung‘)
    (‘Model‘, u‘SM-N9100\x00‘)
    (‘DateTime‘, u‘2016:05:07 15:32:37‘)
    (‘JpegIFOffset‘, 258)
    (‘ExifOffset‘, 228)

但是经过我各种百度和谷歌之后,并没有找到PIL修改exif信息的操作,希望知道如何用PIL操作exif的各位看官在下面留个言。为此我不得不寻求与其他库,比如piexif(https://pypi.python.org/pypi/piexif)。

根据官方文档显示,piexif只有五个函数,使用起来确实很简单。本文就不充当文档解释的工作了,直接给一个完整的自己写的class。

import piexif
from piexif import ImageIFD # 0th
from piexif import ExifIFD # Exif
from piexif import GPSIFD # GPS
from piexif import InteropIFD #interop

class Exif(dict):
    Group_0th = "0th"
    Group_1st = "1st"
    Group_Exif = "Exif"
    Group_GPS = "GPS"
    Group_Interop = "Interop"
    Group_Thumbnail = "thumbnail"
    _unkown_tag = {"name":"unkown","type":"unkown"}
    def __init__(self,path):
        dict.__init__(self)
        self.__name = path
        self.update(piexif.load(self.__name))

    def pretty_dict(self):
        """print exif info"""
        ret_dict = {}
        for group,group_value in self.items():
            ret_dict.setdefault(group,{})
            if group_value is not None and group_value:
                for tag,value in group_value.items():
                    name = piexif.TAGS[group].get(tag,self._unkown_tag)["name"]
                    ret_dict[group][name] = value
        return ret_dict

    def as_byte(self):
        """for raw write exif to image"""
        return piexif.dump(self)

    def write(self,path=None):
        piexif.insert(self.as_byte(),path or self.__name)

    def insert_exif(self,group,tags):
        """group is one of Group_0th,Group_1st,Group_Exif,
                         Group_GPS,Group_Interop,Group_Thumbnail
            tags reference class ImageIFD,ExifIFD,GPSIFD,InteropIFD
        """
        if isinstance(tags,dict):
            for tag,value in tags.items():
                self[group][tag] = value
        elif isinstance(tags,list) or isinstance(tags,tuple):
            for tag,value in tags:
                self[group][tag] = value

    def remove_exif(self,group,tag=None):
        """group is one of Group_0th,Group_1st,Group_Exif,
                         Group_GPS,Group_Interop,Group_Thumbnail
            tags reference class ImageIFD,ExifIFD,GPSIFD,InteropIFD
        """
        if tag is None:
            self[group] = {}
        elif tag in self[group]:
            del self[group][tag]

下图是一个添加了exif信息的图片头:

FF D8 是jpg文件的标识头

FF E1 Exif头部开始标志

00 29 根据jpeg标准,29(注意,这是十六进制)是段内容和段长度本身但不包括段标识和段类型的长度

45 79 69 66 00 00 Exif内容的前缀(这是固定的)

4D 4D 00 2A …… 45 49 00 FF Exif内容

可以看出,exif信息只是填充在jpg文件中的一个FF E1打头的注释段,填充在文件头部。

时间: 2024-10-06 00:10:47

图片中的exif数据的相关文章

如何识别图片中的表格数据

??在很多时候,我们的数据来源形式是多种多样的,有时候数据(或表格)也会呈现在图片中.那么,我们如何来获取图片中的有用数据呢?当一张图片中含有表格数据的时候,我们可以用OpenCV识别表格中的直线,然后再用OCR技术识别其中的文字. ??本文仅作为如何识别图片中的表格的一个例子,希望能给读者一些启示.笔者用到的工具如下: opencv pyteressact numpy 我们用opencv来识别表格中的直线,用pyteressact来识别单元格文字,用numpy做数值处理.我们要识别的示例图片(

【图像处理】提取图片中的交点数据

1. 前言 前两天老板突然给了一幅图像数据, 让我提取出其中的交点信息, 图片是这样的: 由于图像数据实在太大,就传了一张截图上来~~ 2. 处理思路 2.1 基本需求 我们的需求实际上就是, 提取图像中黑色线段相交的部分(简单来说就是相交的点) 2.2 基本思路 检测图像中的黑色直线部分, 根据hough变换提取出相应的直线方程, 根据直线方程求出他们的交点, 即为我们所需要的点.由于处理的时候, 存在一定误差, 所以一般可以分为两个步骤, 先粗略的寻找一个交点, 然后对他的周围进行搜素即可.

图片中的Exif信息 的ExifDirectory的大部份常量

#define FMT_BYTE        1           //Format Byte #define FMT_STRING      2 #define FMT_USHORT      3 #define FMT_ULONG       4 #define FMT_URATIONAL   5 #define FMT_SBYTE       6 #define FMT_UNDEFINED   7 #define FMT_SSHORT      8 #define FMT_SLONG 

Android -- Exif

Exif Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了数码照片的信息,包括拍摄的光圈.快门.平衡白.ISO.焦距.日期时间等各种和拍摄条件以及相机品牌.型号.色彩编码以及GPS等. ExifInterface 在Android下,通过ExifInterface类操作图片的Exif信息,虽然这个类的名字包含Interface,但它不是一个接口,它是一个类,处于"android.media.ExifInterface"包下,

Android 图片Exif信息相关的获取与修改

1 Exif是什么 Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.ISO.焦距.日期时间等各种和拍摄条件以及相机品牌.型号.色彩编码以及GPS等.简单来 说,Exif=拍摄参数+JPED.因此,可以利用任何可以查看JPEG文件的看图软件浏览Exif信息,但是并不是所有图形程序都能处理Exif信息, 而自Android2.0之后,加入了对图片Exif数据的支持. 2 ExifInterf

(四十三)获取图片exif信息

1.什么是Exif Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了数码照片的信息,包括拍摄的光圈.快门.平衡白.ISO.焦距.日期时间等各种和拍摄条件以及相机品牌.型号.色彩编码以及GPS等.简单来说,Exif=拍摄参数+JPED.因此,可以利用任何可以查看JPEG文件的看图软件浏览Exif信息,但是并不是所有图形程序都能处理Exif信息,而自Android2.0之后,加入了对图片Exif数据的支持. 2.ExifInterface

图片Exif信息

Exif文件格式简述链接:https://www.zhihu.com/question/23727439/answer/25467748 可交换图像文件常被简称为Exif(Exchangeable image file format),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据. Exif最初由日本电子工业发展协会在1996年制定,版本为1.0.1998年,升级到2.1,增加了对音频文件的支持.2002年3月,发表了2.2版. Exif可以附加于JPEG.TIFF.RIF

获取图片的EXIF信息

对于专业的摄影师来说,Exif信息是很重要的信息,也包含了非常多的东西 1.EXIF EXIF(Exchangeable Image File)是“可交换图像文件”的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数.缩略图及其他属性信息. Exif是一种图像文件格式,它的数据存储与JPEG格式是完全相同的.利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息. Exif 所记录的元数据信息非常丰富,主要包含了以下几

Android 下的EXIF

一.什么是Exif Exif(Exchangeable Image File 可交换图像文件)是一种图象文件格式,它的数据存储与JPEG格式是完全相同的.实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍 摄时的光圈.快门.白平衡.ISO.焦距.日期时间等各种和拍摄条件以及相机品牌.型号.色彩编码.拍摄时录制的声音以及全球定位系统(GPS).缩略图 等.简单地说,Exif=JPEG+拍摄参数.因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有