import struct import os import sys from PIL import Image def extract_textures_from_file(filename, output_dir="textures"): """ Извлекает текстуры из файла в отдельные PNG файлы с индексированными цветами """ # Создаем директорию для выходных файлов os.makedirs(output_dir, exist_ok=True) # Читаем файл with open(filename, 'rb') as f: fil = f.read() # Получаем список смещений текстур tx_offsets = [] first_addr = struct.unpack(' 0: color_code = struct.unpack('> 5) * 8 b = ((color_code & 0x7C00) >> 10) * 8 palette.extend([r, g, b]) # Дополняем палитру до 256 цветов (если нужно) while len(palette) < 768: # 256 цветов * 3 канала palette.append(0) # Создаем изображение с индексированными цветами img_data = [] image_data_remains = image_size - 12 for y in range(image_h): row = [] for x in range(image_w): if image_data_remains > 0: color_index = fil[reader] row.append(color_index) reader += 1 image_data_remains -= 1 else: row.append(0) # Заполняем нулями если данные закончились img_data.append(row) # Создаем изображение из данных img = Image.new('P', (image_w, image_h)) # Заполняем пиксели for y in range(image_h): for x in range(image_w): if y < len(img_data) and x < len(img_data[y]): img.putpixel((x, y), img_data[y][x]) # Устанавливаем палитру img.putpalette(palette) # Сохраняем как PNG output_filename = os.path.join(output_dir, f"texture_{a:03d}.png") img.save(output_filename, 'PNG') print(f"Сохранено: {output_filename}") except Exception as e: print(f"Ошибка при обработке текстуры {a}: {e}") continue def main(): if len(sys.argv) != 2: print("Использование: python extract.py <имя_файла>") sys.exit(1) filename = sys.argv[1] if not os.path.exists(filename): print(f"Файл {filename} не найден!") sys.exit(1) print(f"Обрабатываю файл: {filename}") extract_textures_from_file(filename) print("Готово!") if __name__ == "__main__": main()