def decode(self): info_print("started decoding raw data") bit_reader = JpegBitReader(self.raw_data) pixels_mcu_horiz = self.jpeg_decode_metadata.horiz_pixels_in_mcu pixels_mcu_vert = self.jpeg_decode_metadata.vert_pixels_in_mcu n_mcu_horiz = math.ceil(self.jpeg_decode_metadata.width / pixels_mcu_horiz) n_mcu_vert = math.ceil(self.jpeg_decode_metadata.height / pixels_mcu_vert) self.huffman_decode_mcus( bit_reader, self.jpeg_decode_metadata.components_to_metadata, n_mcu_horiz, n_mcu_vert, self.jpeg_decode_metadata.restart_interval) info_print("time:", time.time()) if ENCODING_TEST: encoder = JpegEncoder(self.jpeg_decode_metadata) res = encoder.encode(self._decoded_mcu_list) min_len = min(len(res), len(bit_reader._bytes)) is_eq = res[:min_len] == bit_reader._bytes[:min_len] info_print( f"Equal? {'Yes ☺' if is_eq else 'No!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'}" ) writer = JpegWriter() writer.write(self.jpeg_decode_metadata, res) self.de_quantize(self.jpeg_decode_metadata.components_to_metadata) info_print("time:", time.time()) self.inverse_dct( self.jpeg_decode_metadata.components_to_metadata.keys()) # TODO: The code up until now is true regardless of the number of components, # from here and on it is color space dependent and needs to be fixed because the next function shouldn't be self.construct_pixel_map(n_mcu_horiz, pixels_mcu_horiz, pixels_mcu_vert) # DROR From here it should be color space dependent self._to_rgb() return bit_reader.get_byte_location( ), self._full_image_rgb, n_mcu_horiz * pixels_mcu_horiz, n_mcu_vert * pixels_mcu_vert