работа с.файлы 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)