def parse(self, jpeg): self.__offset = 2 result = {} while True: segment_marker = struct.unpack_from("2c", jpeg, self.__offset) self.__offset += 2 if segment_marker == self.__SOS: break if segment_marker == self.__EOI: break segment_length = struct.unpack_from(">H", jpeg, self.__offset)[0] for frame_header_marker in self.__SOFs: if segment_marker == frame_header_marker: (height, width, channels) = struct.unpack_from(">HHB", jpeg, self.__offset + 3) result["width"] = width result["height"] = height result["mode"] = self.__get_color_mode(channels) break if segment_marker == self.__APP1: app1_magic = struct.unpack_from("6c", jpeg, self.__offset + 2) if app1_magic == (b'\x45', b'\x78', b'\x69', b'\x66', b'\x00', b'\x00'): exif_parser = Exif(jpeg, self.__offset + 8, segment_length) tags = [ (271, "maker"), (272, "model"), (2, "latitude"), (4, "longitude"), (36867, "DateTimeOriginal") ] for tag in tags: try: value = exif_parser.search_tag(jpeg, target_tag=tag[0], clear_offset=True) result[tag[1]] = value except ValueError: pass self.__offset += segment_length return result