Как редактировать BMP-файл в Python?

У меня задача - открыть с бинарном режиме BMP-файл и изменить его (сделать негатив данной картинки). По условию:

На вход программе подается BMP-файл, содержащий некоторое изображение. Без использования сторонних графических библиотек (например, PIL) сформируйте новый файл, в который сохраните негатив, полученный из исходного изображения.

У BMP-файла очень простая структура. Первые 54 байта являются заголовком, и их нужно оставить без изменения. А все остальные байты надо заменить на значение, вычисленное как 255-value, где value - это значение прочитанного байта.

Однако, если открыть файл, то откроются 2 блока: один на 104 байт, остальной - оставшееся кол-во байт.

f = open('3214.bmp', mode='rb')

Даже если это как-то умудриться обработать и попытаться записать в конечный файл эти данные - выходит ошибка.

with open('312312.bmp', 'wb') as f1:
    f1.write(bytes(z))
    f1.write(bytes(t))

Тут z - список int значений первых 54 байт, t - все остальные

f1.write(bytes(t)) TypeError: 'bytes' object cannot be interpreted as an integer

Как все-таки необходимо реализовать такую обработку файла? Ибо у меня просто кончились идеи, как я могу выполнить задачу.


Ответы (1 шт):

Автор решения: strawdog

не смотря не то, что "ванильный" способ малоэффективен и ресурсоемок, сделать это можно так:

введите сюда описание изображения

f = open('butterfly.bmp', mode='rb')
header = f.read(54)
res = [255-val for val in f.read()]
f.close()
o = open("neg.bmp", mode="wb")
o.write(header)
o.write(bytes(res))
o.close()

Или, используя контекст-менеджеры (что правильнее):

with open('butterfly.bmp', mode='rb') as inputfile:
    header = inputfile.read(54)
    res = [255-val for val in inputfile.read()]
    with  open("neg.bmp", mode="wb") as outputfile:
        outputfile.write(header)
        outputfile.write(bytes(res)) 

Получим, соответственно:

введите сюда описание изображения

→ Ссылка