Простой способ сделать это с помощью сторонней библиотеки обработки изображений, например PIL/Pillow. Код достаточно прост, чтобы вы могли разобраться в нем в нескольких минутах от примеров на модуле Image
...
Но если вам не разрешено это делать, давайте посмотрим, как это сделать вручную.
Во-первых, BMP не является текстовым файловым форматом, это двоичный формат. Это означает, что вы должны прочитать его в двоичном режиме. И вы не можете прочитать его «по строкам», потому что у него нет строк для чтения. Поскольку объект bytes
не изменен, вы, вероятно, захотите его скопировать в bytearray
для работы. Итак:
with open('spam.bmp', 'rb') as f:
data = bytearray(f.read())
Далее необходимо проанализировать формат файла BMP. Я предполагаю, что основной момент упражнения - выяснить, как это сделать самому, поэтому я дам вам ссылку на Wikipedia's article, которая описывает ее лучше, чем документы Microsoft, и вы можете перейти оттуда.
Модуль struct
в стандартной библиотеке будет очень полезен для интерпретации заголовков; гораздо проще читать 32-битное малоконечное число с struct.unpack_from('<L', data, offset)
, чем с помощью чтения data[offset]
, data[offset+1]
и т. д. и перекомбинировав их в 32-битное число.
Я предполагаю, что вы можете игнорировать все варианты сжатия BMP, иначе это было бы слишком сложным назначением. На самом деле вы можете просто предположить, что все заголовки будут указывать наиболее распространенный вариант и только код для этого. Но вы можете попросить своего учителя об этом.
Теперь, когда вы нашли часть «пиксельного массива» в BMP, и вы поняли, как интерпретировать ее из заголовка DIB, вы можете просто установить пикселы в белый цвет в зависимости от того, что вы хотите, установив значения в соответствующих индексах bytearray.Например, это может оказаться столь же просто, как:
pos = pixel_array_offset + row_size * y + pixel_size * x
data[pos:pos+3] = 255, 255, 255
Наконец, как только вы изменили свои красные пиксели на белый, вы можете сохранить его:
with open('eggs.bmp', 'wb') as f:
f.write(data)
вы должны готовы сделать это без использования сторонних модулей, например, PIL/Pillow? – abarnert
, по-видимому, нет. используя только базовое кодирование. это первый курс курса курса cp. Я попытался использовать изображение импорта, но это недопустимо – amin
Посмотрите на [это] (http://www.python.org.br/wiki/ImagemTGA). Программа Python для начала –