def identify(src): ''' Recognize file format and sizes. Returns format, width, height. width and height will be -1 if not found and fmt will be None if the image is not recognized. ''' width = height = -1 if isinstance(src, type('')): stream = lopen(src, 'rb') elif isinstance(src, bytes): stream = ReadOnlyFileBuffer(src) else: stream = src pos = stream.tell() head = stream.read(HSIZE) stream.seek(pos) fmt = what(None, head) if fmt in {'jpeg', 'gif', 'png', 'jpeg2000'}: size = len(head) if fmt == 'png': # PNG s = head[16:24] if size >= 24 and head[12:16] == b'IHDR' else head[ 8:16] try: width, height = unpack(b">LL", s) except error: return fmt, width, height elif fmt == 'jpeg': # JPEG pos = stream.tell() try: height, width = jpeg_dimensions(stream) except Exception: return fmt, width, height finally: stream.seek(pos) elif fmt == 'gif': # GIF try: width, height = unpack(b"<HH", head[6:10]) except error: return fmt, width, height elif size >= 56 and fmt == 'jpeg2000': # JPEG2000 try: height, width = unpack(b'>LL', head[48:56]) except error: return fmt, width, height return fmt, width, height
def identify(src): ''' Recognize file format and sizes. Returns format, width, height. width and height will be -1 if not found and fmt will be None if the image is not recognized. ''' width = height = -1 if isinstance(src, type('')): stream = lopen(src, 'rb') elif isinstance(src, bytes): stream = ReadOnlyFileBuffer(src) else: stream = src pos = stream.tell() head = stream.read(HSIZE) stream.seek(pos) fmt = what(None, head) if fmt in {'jpeg', 'gif', 'png', 'jpeg2000'}: size = len(head) if fmt == 'png': # PNG s = head[16:24] if size >= 24 and head[12:16] == b'IHDR' else head[8:16] try: width, height = unpack(b">LL", s) except error: return fmt, width, height elif fmt == 'jpeg': # JPEG pos = stream.tell() try: height, width = jpeg_dimensions(stream) except Exception: return fmt, width, height finally: stream.seek(pos) elif fmt == 'gif': # GIF try: width, height = unpack(b"<HH", head[6:10]) except error: return fmt, width, height elif size >= 56 and fmt == 'jpeg2000': # JPEG2000 try: height, width = unpack(b'>LL', head[48:56]) except error: return fmt, width, height return fmt, width, height