Пример #1
0
    def parse_swf_head(self):
        "swf_header"
        self.magic = self.swf_read(3)
        self.version = ord(self.swf_read(1))
        self.file_length = le4byte(self.swf_read(4))

        "swf_header_movie"
        # twips 関連のヘッダは、今は飛ばす
        rectbits = ord(self.swf_read(1)) >> 3
        total_bytes = int(ceil((5 + rectbits * 4) / 8.0))
        self.swf_read(total_bytes - 1)

        # frame 関連
        self.frame_rate_decimal = ord(self.swf_read(1))
        self.frame_rate_integer = ord(self.swf_read(1))
        self.frame_count = le2byte(self.swf_read(2))

        # ヘッダー, twips, frame データを取っておく
        self.swf_head = self.swf[:self.swf_pos]

        if DEBUG:
            print "magic: %s\nver: %d\nlen: %d\n" \
                "frame_rate: %d.%d\ncount: %d\n" % ( \
                self.magic,
                self.version,
                self.file_length,
                self.frame_rate_integer,
                self.frame_rate_decimal,
                self.frame_count)
Пример #2
0
    def replace_lossless(self, block, image_data):
        """
        DefineBitsLossless, DefineBitsLossless2 を置き換える関数
        画像を置き換える際に行うこと
        1. lossless データの置き換え
        2. ヘッダーの length の置き換え
        3. tag block での length の置き換え
        4. width, height, format データの置き換え
        """
        tag_raw = block['value'][:2]
        old_length = block['block_len']   # block['value'][2:6] と同じはず
        image_id = le2byte(block['value'][6:8])
        # format = ord(block['value'][8])

        # 1.
        g = Image2lossless(image_data, block['tag'])
        fv_read = g.convert()
        new_length = len(fv_read) + 7

        # 2.
        self.file_length += (new_length - old_length)

        # 3.
        block['block_len'] = new_length

        # 4.
        block['value'] = \
            tag_raw + \
            _h32(new_length) + \
            _h16(image_id) + \
            g.get_lossless_format() + \
            _h16(g.width()) + \
            _h16(g.height()) + \
            fv_read
Пример #3
0
 def replace_images(self, images):
     for block in self.swf_blocks:
         if block['tag'] in (20, 21, 36):
             image_id = le2byte(block['value'][6:8])
             if image_id in images:
                 if block['tag'] in (20, 36):   # DefineBitsLossless, DefineBitsLossless2
                     self.replace_lossless(block, images[image_id])
                 elif block['tag'] == 21:   # DefineBitsJPEG2
                     self.replace_jpeg(block, images[image_id])
Пример #4
0
    def parse_swfblock(self):
        swf_block_start = self.swf_pos
        swf_tag = le2byte(self.swf_read(2))
        block_len = swf_tag & 0x3f
        if block_len == 0x3f:
            block_len = le4byte(self.swf_read(4))
        swf_tag = swf_tag >> 6
        if swf_tag == 0:
            return None
        try:
            swf_tag_name = swf_tag_name_entry[swf_tag]
        except KeyError:
            swf_tag_name = "Unknown"

        ret = {}
        ret['block_start'] = swf_block_start
        ret['tag'] = swf_tag
        ret['block_len'] = block_len
        ret['tag_name'] = swf_tag_name
        self.swf_pos += block_len
        ret['value'] = self.swf[swf_block_start:self.swf_pos]
        return ret
Пример #5
0
    def parse_swfblock(self):
        block_start = self.offset
        tag = le2byte(self.read(2))
        block_len = tag & 0x3f
        if block_len == 0x3f:
            block_len = le4byte(self.read(4))
        tag = tag >> 6

        content_offset = self.offset - block_start
        self.offset += block_len

        args = [
            tag,
            block_len,
            content_offset,
            self.value[block_start:self.offset],
            self.base_block,
            self.swf]

        if tag in SWF_TAG:
            return SWF_TAG[tag](*args)
        else:
            return SwfBlock(*args)