2013-11-29 1 views
6

У меня есть BMP-файл. Это просто красный квадрат. Мне нужно написать программу с функциями, чтобы она имела белые полосы. Вещи, которые мне нужно будет сделать:Работа с файлами .bmp в python 3

  • загрузить файл BMP.
  • прочитайте и оцените файл bmp.
  • код определенных областей координат файла, который должен быть окрашен в белый цвет.
  • закрыть файл
  • отображения файла, качества конечного продукта в качестве выходного

Я новичок, и у меня возникают проблемы с чтением или отображение исходного файла BMP, не говоря уже редактировать содержимое внутри. он не похож на открытие txt-файла и «readline()». Кроме того, когда я копирую вставку bmp-файла в папку spc проектов pydev scl в eclipse, он не отображается в eclipse, поэтому я не знаю, узнает ли компьютер, что файл есть. Я хочу прочитать об этом перед публикацией здесь, но я, похоже, не получаю много результатов в поисковых системах, так как не уверен точно, что я должен искать.

+1

вы должны готовы сделать это без использования сторонних модулей, например, PIL/Pillow? – abarnert

+0

, по-видимому, нет. используя только базовое кодирование. это первый курс курса курса cp. Я попытался использовать изображение импорта, но это недопустимо – amin

+1

Посмотрите на [это] (http://www.python.org.br/wiki/ImagemTGA). Программа Python для начала –

ответ

16

Простой способ сделать это с помощью сторонней библиотеки обработки изображений, например 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) 
+0

спасибо человеку. это очень помогло мне. Я не был уверен, как обрабатывать файл BMP. я буду искать больше для двоичных типов файлов. – amin