2011-05-01 3 views
3

jpeg 파일에서 너비와 높이를 구문 분석하는 python 함수를 작성하려고합니다. 내가 현재 가지고있는 코드는이 문제의 부부가 첫째로 나는에서 읽을 곳을 작업 할 파일을 통해 볼 필요하지만이 있습니다이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

감사합니다, 확실히 ('> HH', 헥스))'훨씬 깔끔'struct.unpack를 사용하여, 매우 유용 보이는 : 도토리의 솔루션을 구축, 나는 Python3에 나를 위해 작동하는이 함께했다 시작합니다. –

0

나의 제안 : PIL합니다 (Python Imaging Library)를 사용합니다.

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

그렇지 않으면, 순수한 파이썬 라이브러리입니다 Hachoir를 사용; 특히 hachoir-metadata은 원하는 기능을 갖고있는 것 같습니다.)

+2

필자가 아는 한, PIL은 py3k에서 실행되지 않습니다. – Daenyth

+1

이 경우에는 'pillow'를 사용하십시오 – malat

2

바이트와 문자열을 변경했기 때문에 파이썬 3에서 어떤 솔루션을 사용할 수 없었습니다.

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

관련 문제