使用python读取jpeg的EXIF数据

时间:2013-11-06 16:23:43

标签: python binary jpeg exif

我正在尝试创建一个程序来获取jpeg的特定EXIF信息,而不使用PIL等。我正在以二进制文件读取文件,但输出有点令人困惑......

file = open("/Users/Niko/Desktop/IMG.JPG", "rb")
print(file.read(16))

哪个输出:

b'\xff\xd8\xff\xe1/\xfeExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x0b\x01\x0f\x00\x02\x00\x00\x00\x06\x00\x00'

我感到困惑的是“\”,“/”和“*”是什么意思...... 我知道表示其jpeg的前几个字节是0xFF 0xD8,所以我认为\ s是0?任何人都可以帮我理解这个吗?

为任何初学者的错误道歉,一般都是编码的新手,并且刚刚开始创建这个程序。

1 个答案:

答案 0 :(得分:1)

Python为您提供了可以复制并再次粘贴到Python解释器中的字节字符串的表示。

为了使能够将其粘贴到不处理原始字节的内容中,可以使用Python字节转义码\xHH对任何不可打印的内容进行转义,表示一个字节的十六进制值。

可打印的任何内容都直接表示为ASCII字符。十六进制字节0x41是ASCII中的字母A(大写),并按原样打印:

>>> b'\x41'
b'A'

因此,*是hex 2A,/是hex 2F:

>>> hex(ord(b'*'))
'0x2a'
>>> hex(ord(b'/'))
'0x2f'

您可以使用binascii.hexlify()生成字节的全十六进制表示形式:

>>> from binascii import hexlify
>>> hexlify(b'\xff\xd8\xff\xe1/\xfeExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x0b\x01\x0f\x00\x02\x00\x00\x00\x06\x00\x00')
b'ffd8ffe12ffe4578696600004d4d002a00000008000b010f0002000000060000'

那就是说,你最好安装Pillow(Python图像库的现代化分支)并让它为你处理JPEG图像,包括extracting EXIF information