2011-05-01 50 views
3

我想寫一個python函數來解析jpeg文件的寬度和高度。我目前擁有的代碼看起來像這樣Python3 - 解析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後)其次,我需要避免從嵌入的縮略圖中獲取數據。有什麼建議麼?這個功能的

回答

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 
+0

謝謝,這看起來真的很有用,當然使用'struct.unpack(「> HH」,十六進制))'是更整潔作爲一個開始。 – 2011-05-01 21:57:03

0

我的建議是:使用PIL(該Python Imaging Library)。

>>> import Image 
>>> img= Image.open("test.jpg") 
>>> print img.size 
(256, 256) 

否則,使用Hachoir這是一個純粹的Python庫;特別是hachoir-metadata似乎有你想要的功能)。

+2

據我所知,PIL仍然不能在py3k上運行。 – Daenyth 2011-05-02 01:13:56

+1

在這種情況下使用'pillow' – malat 2015-09-22 12:13:23

2

由於字節和字符串的變化,我無法獲得任何解決方案在Python3中工作。在橡果的解決方案的基礎上,我想出了這一點,這對我來說在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() 
+0

您打開'dafile'但不關閉它。除此之外它工作正常。 – user136036 2015-10-25 14:16:48