Как редактировать 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 шт):
не смотря не то, что "ванильный" способ малоэффективен и ресурсоемок, сделать это можно так:
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))
Получим, соответственно:

