我正在尝试编写一个python函数来解析jpeg文件的宽度和高度。我目前的代码看起来像这样
import struct
image = open('images/image.jpg','rb')
image.seek(199)
#reverse hex to deal with endianness...
hex = image.read(2)[::-1]+image.read(2)[::-1]
print(struct.unpack('HH',hex))
image.close()
但是有一些问题,首先我需要查看文件以找出从哪里读取(在ff c0 00 11 08之后),其次我需要避免从嵌入的缩略图中获取数据。有什么建议吗?
答案 0 :(得分:4)
此功能的JPEG部分可能很有用:http://code.google.com/p/bfg-pages/source/browse/trunk/pages/getimageinfo.py
jpeg.read(2)
b = jpeg.read(1)
try:
while (b and ord(b) != 0xDA):
while (ord(b) != 0xFF): b = jpeg.read(1)
while (ord(b) == 0xFF): b = jpeg.read(1)
if (ord(b) >= 0xC0 and ord(b) <= 0xC3):
jpeg.read(3)
h, w = struct.unpack(">HH", jpeg.read(4))
break
else:
jpeg.read(int(struct.unpack(">H", jpeg.read(2))[0])-2)
b = jpeg.read(1)
width = int(w)
height = int(h)
except struct.error:
pass
except ValueError:
pass
答案 1 :(得分:2)
由于字节和字符串的更改,我无法使用Python3中的任何解决方案。在Acorn的解决方案的基础上,我提出了这个,它在Python3中适用于我:
import struct
import io
height = -1
width = -1
dafile = open('test.jpg', 'rb')
jpeg = io.BytesIO(dafile.read())
try:
type_check = jpeg.read(2)
if type_check != b'\xff\xd8':
print("Not a JPG")
else:
byte = jpeg.read(1)
while byte != b"":
while byte != b'\xff': byte = jpeg.read(1)
while byte == b'\xff': byte = jpeg.read(1)
if (byte >= b'\xC0' and byte <= b'\xC3'):
jpeg.read(3)
h, w = struct.unpack('>HH', jpeg.read(4))
break
else:
jpeg.read(int(struct.unpack(">H", jpeg.read(2))[0])-2)
byte = jpeg.read(1)
width = int(w)
height = int(h)
print("Width: %s, Height: %s" % (width, height))
finally:
jpeg.close()
答案 2 :(得分:0)
我的建议:使用PIL(Python Imaging Library)。
>>> import Image
>>> img= Image.open("test.jpg")
>>> print img.size
(256, 256)
否则,使用Hachoir这是一个纯Python库;特别是hachoir-metadata似乎有你想要的功能。