web-dev-qa-db-ja.com

python 3の.bmpファイルの操作

Bmpファイルがあります。ただの赤い四角です。白い縞模様にする関数を使ったプログラムを書かなければなりません。私がする必要があること:

  • bmpファイルをロードします。
  • bmpファイルを読んで評価します。
  • ファイルの特定の領域の座標を白く着色するようにコーディングします。
  • ファイルを閉じる
  • 最終製品ファイルを出力として表示します

私は初心者で、元のbmpファイルの読み取りや表示に問題があり、内部のコンテンツを編集することはできません。 txtファイルと「readline()」を開くのとは異なります。また、Eclipseのpydevプロジェクトのsrcフォルダーにbmpファイルをコピーして貼り付けると、Eclipseに表示されないため、ファイルがそこにあることをコンピューターがどのように認識するかがわかりません。ここに投稿する前にそれを読みたいのですが、何を検索すればよいか正確にわからないため、グーグルで結果があまり得られないようです。

9
amin

これを行う簡単な方法は、 PIL/Pillow のようなサードパーティの画像処理ライブラリを使用することです。コードは非常に単純なので、 Image モジュールドキュメントの例から数分で理解できます…

ただし、それが許可されていない場合は、手動でこれを行う方法を見てみましょう。

まず、BMPはテキストファイル形式ではなく、binary形式です。つまり、読む必要があります。バイナリモードでは、読み取るテキストの行がないため、「1行ずつ」読み取ることはできません。bytesオブジェクトは変更できないため、おそらくコピーする必要があります。作業するbytearrayに。だから:

_with open('spam.bmp', 'rb') as f:
    data = bytearray(f.read())
_

次に、BMPファイル形式を解析する必要があります。演習の要点はそれを自分で行う方法を理解することだと思いますので、 へのリンクを示します。ウィキペディアの記事 、Microsoftのドキュメントよりもよく説明されており、そこからアクセスできます。

標準ライブラリの struct モジュールは、ヘッダーの解釈に非常に役立ちます。 _data[offset]_、_data[offset+1]_などを読み取ってそれらを32ビットの数値に再結合するよりも、struct.unpack_from('<L', data, offset)を使用して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)
_
19
abarnert