Created
August 5, 2013 11:40
-
-
Save atlithorn/6155288 to your computer and use it in GitHub Desktop.
Image dimensions without downloading entire image to disk
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def getImageInfo(url): | |
sock = urllib2.urlopen(url) | |
data = str(sock.read(32)) | |
size = len(data) | |
height = -1 | |
width = -1 | |
content_type = '' | |
# handle GIFs | |
if (size >= 10) and data[:6] in ('GIF87a', 'GIF89a'): | |
# Check to see if content_type is correct | |
content_type = 'image/gif' | |
w, h = struct.unpack("<HH", data[6:10]) | |
width = int(w) | |
height = int(h) | |
# See PNG 2. Edition spec (http://www.w3.org/TR/PNG/) | |
# Bytes 0-7 are below, 4-byte chunk length, then 'IHDR' | |
# and finally the 4-byte width, height | |
elif ((size >= 24) and data.startswith('\211PNG\r\n\032\n') | |
and (data[12:16] == 'IHDR')): | |
content_type = 'image/png' | |
w, h = struct.unpack(">LL", data[16:24]) | |
width = int(w) | |
height = int(h) | |
# Maybe this is for an older PNG version. | |
elif (size >= 16) and data.startswith('\211PNG\r\n\032\n'): | |
# Check to see if we have the right content type | |
content_type = 'image/png' | |
w, h = struct.unpack(">LL", data[8:16]) | |
width = int(w) | |
height = int(h) | |
# handle JPEGs | |
elif (size >= 2) and data.startswith('\377\330'): | |
content_type = 'image/jpeg' | |
#we need to refetch because we don't really know how far we have to go | |
#would have been tidier to just always read what you need but couldn't be bothered right now | |
jpeg = urllib2.urlopen(url) | |
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 | |
else: | |
content_type = "unknown" | |
width = 0 | |
height = 0 | |
return width, height |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment