Example #1
0
    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