Esempio n. 1
0
    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