def dump_to_file(self, tiled_map, file_path): """ 将tiled_map保存在给定的文件中 """ tiled_map_stream = StringIO() self.dump_to_stream(tiled_map, tiled_map_stream) tiled_map_stream.seek(0) compressed_bin = zlib.compress(tiled_map_stream.read()) with open(file_path, 'wb') as f: f.write(compressed_bin)
def get_png(self, fobj): output = StringIO() if isinstance(fobj, basestring): path = fobj if not path.startswith('/'): path = os.path.join(settings.MEDIA_ROOT, path) fobj = open(fobj) img = Image.open(fobj) img.save(output, format="PNG") output.seek(0) return output
def read_from_file(self, file_path): """ 读取并解析map文件 """ with open(file_path, 'rb') as f: compressed_bin = f.read() raw_binary = zlib.decompress(compressed_bin) tiled_map_stream = StringIO(raw_binary) tiled_map = TiledMap() # 读取Header部分 header_stream = StringIO(tiled_map_stream.read(104)) header_fields = self.parse_fields( header_stream, self.header_fields_desc) tiled_map.update_fields(**header_fields) # 读取tiles部分 tiles = [] tile_length = tiled_map.tile_row * tiled_map.tile_col tile_stream = StringIO(tiled_map_stream.read(tile_length)) for i in xrange(0, tiled_map.tile_row * tiled_map.tile_col): tile_byte = struct.unpack('b', tile_stream.read(1))[0] tile = MapTile.from_byte(tile_byte) tiles.append(tile) tiled_map.tiles = tiles # 读取elements部分 for i in xrange(0, tiled_map.element_num): element = MapElement() element_header_stream = StringIO(tiled_map_stream.read(20)) element_fields = self.parse_fields( element_header_stream, self.element_header_fields_desc) element.update_fields(**element_fields) if element.data_length > 0: element.data = tiled_map_stream.read(element.data_length) else: element.data = '' tiled_map.elements.append(element) # 读取jump elements部分 for i in xrange(0, tiled_map.jump_point_num): jump_point = MapJumpPoint() jump_point_header_stream = StringIO(tiled_map_stream.read(48)) jump_point_fields = self.parse_fields( jump_point_header_stream, self.jump_point_header_fields_desc) jump_point.update_fields(**jump_point_fields) if jump_point.data_length > 0: jump_point.data = tiled_map_stream.read(jump_point.data_length) tiled_map.jump_points.append(jump_point) return tiled_map