работа с.файлы bmp в python 3
У меня есть файл bmp. Это просто Красная площадь. Я должен написать программу с функциями, чтобы она имела белые полосы. Вещи, которые мне нужно было бы сделать:
- загрузите файл bmp.
- чтение и оценка файла bmp.
- код определенные области координаты файла, чтобы быть окрашены в белый цвет.
- закрыть файл
- показать файл end продукт как выход
Я новичок, и у меня возникли проблемы с чтением или отображением исходный файл bmp, не говоря уже о редактировании содержимого внутри. это не похоже на открытие txt-файла и "readline()". кроме того, когда я копирую вставку файла bmp в папку PyDev projects src в eclipse, он не отображается в eclipse, поэтому я не знаю, как компьютер распознает, что файл есть. я хочу прочитать об этом перед публикацией здесь, но, похоже, я не получаю много результатов в гугле, так как я не уверен, что именно я должен искать.
1 ответов
простой способ сделать это - с помощью сторонней библиотеки обработки изображений, такой как PIL / подушка. Код достаточно прост, чтобы вы могли понять это за несколько минут из примеров на Image
модуль "документы"...
но если вам это не разрешено, давайте посмотрим, как это сделать вручную.
во-первых, BMP-это не формат текстового файла, это бинарные. Это означает, что вы должны прочитать его в бинарном режиме. И вы не можете прочитать его "строка за строкой", потому что у него нет строк текста для чтения. Сbytes
объект не является изменяемым, вы, вероятно, захотите скопировать его в bytearray
для работы. Итак:
with open('spam.bmp', 'rb') as f:
data = bytearray(f.read())
Далее необходимо проанализировать формат файла BMP. Я предполагаю, что основной смысл упражнения-выяснить, как это сделать самостоятельно, поэтому я дам вам ссылку на Википедии, который описывает его лучше, чем Microsoft docs, и вы можете перейти от там.
на struct
модуль в стандартной библиотеке будет очень полезен для интерпретации заголовков; гораздо проще прочитать 32-битное число с struct.unpack_from('<L', data, offset)
чем с чтением data[offset]
, data[offset+1]
, etc. и повторно объединить их в 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)