A short Python function to retrieve image file dimensions, taken from Draco via this ticket on the Django site:
def _imageInfo(fhandle):
"""
Determine the image type of fhandle and return its size.
from draco
"""
head = fhandle.read(24)
if len(head) != 24:
return
if head[:4] == '\x89PNG':
# PNG
check = struct.unpack('>i', head[4:8])[0]
if check != 0x0d0a1a0a:
return
width, height = struct.unpack('>ii', head[16:24])
img_type = 'PNG'
elif head[:6] in ('GIF87a', 'GIF89a'):
# GIF
width, height = struct.unpack('<HH', head[6:10])
img_type = 'GIF'
elif head[:4] == '\xff\xd8\xff\xe0' and head[6:10] == 'JFIF':
# JPEG
img_type = 'JPEG'
try:
fhandle.seek(0) # Read 0xff next
size = 2
ftype = 0
while not 0xc0 <= ftype <= 0xcf:
fhandle.seek(size, 1)
byte = fhandle.read(1)
while ord(byte) == 0xff:
byte = fhandle.read(1)
ftype = ord(byte)
size = struct.unpack('>H', fhandle.read(2))[0] - 2
# We are at a SOFn block
fhandle.seek(1, 1) # Skip `precision' byte.
height, width = struct.unpack('>HH', fhandle.read(4))
except Exception: #IGNORE:W0703
return
else:
return
return img_type, width, height