67 lines
3.1 KiB
Python
67 lines
3.1 KiB
Python
import binascii
|
||
from PIL import Image
|
||
import sys
|
||
import os
|
||
|
||
def extract_bytes(input_file):
|
||
# Создаем имя для выходного бинарного файла, используя имя входного
|
||
base_name = os.path.splitext(input_file)[0]
|
||
output_file = base_name + '_output.bin'
|
||
|
||
with open(input_file, 'r') as f_in:
|
||
data = f_in.read()
|
||
|
||
# Список для хранения байтов
|
||
byte_array = []
|
||
|
||
# Проходим по строке и извлекаем байты, начинающиеся с '0x'
|
||
i = 0
|
||
while i < len(data):
|
||
if data[i:i+2] == '0x': # Ищем '0x'
|
||
hex_str = data[i+2:i+4] # Берем два символа после '0x'
|
||
if len(hex_str) == 2: # Убедимся, что это валидный байт
|
||
byte_array.append(binascii.unhexlify(hex_str)) # Преобразуем в байт
|
||
i += 4 # Пропускаем этот байт
|
||
else:
|
||
i += 1 # Пропускаем все остальные символы
|
||
|
||
# Записываем полученные байты в новый файл
|
||
with open(output_file, 'wb') as f_out:
|
||
f_out.write(b''.join(byte_array))
|
||
|
||
print(f"Байты записаны в {output_file}")
|
||
return output_file # Возвращаем имя бинарного файла
|
||
|
||
def create_image_from_bytes(byte_file, image_file, width, height):
|
||
# Читаем байты из файла
|
||
with open(byte_file, 'rb') as f:
|
||
byte_data = f.read()
|
||
|
||
# Переводим данные в список для изменения порядка байтов (R <-> B)
|
||
byte_data = bytearray(byte_data)
|
||
|
||
# Проходим по данным и меняем местами байты для каналов R и B
|
||
for i in range(0, len(byte_data), 4): # шаг 4, потому что каждый пиксель 4 байта
|
||
# Меняем местами R и B (преобразуем из BGRA в RGBA)
|
||
byte_data[i], byte_data[i+2] = byte_data[i+2], byte_data[i]
|
||
|
||
# Преобразуем байты в изображение
|
||
image = Image.frombytes('RGBA', (width, height), bytes(byte_data))
|
||
image.save(image_file)
|
||
print(f"Изображение сохранено как {image_file}")
|
||
|
||
if __name__ == "__main__":
|
||
input_file = sys.argv[1] # Путь к текстовому файлу
|
||
width = int(sys.argv[2]) # Ширина изображения
|
||
height = int(sys.argv[3]) # Высота изображения
|
||
|
||
# Извлекаем байты из текстового файла и записываем в бинарный файл
|
||
output_file = extract_bytes(input_file)
|
||
|
||
# Создаем имя для изображения, используя имя входного файла
|
||
base_name = os.path.splitext(input_file)[0]
|
||
image_file = base_name + '.png'
|
||
|
||
# Создаем изображение из бинарных данных
|
||
create_image_from_bytes(output_file, image_file, width, height)
|