宿題の一環として、Python で簡単な PNG リーダーを作成することになっています。画像を扱う Python ライブラリの使用は禁止されているため、単一ピクセルの RGB タプルのリスト リスト (画像の行) が必要です。
デコーダーは、IHDR、IDAT、および IEND チャンクのみで構成される最も基本的な PNG 画像のみを読み取り、IDAT は基本的な RGB データのみを読み取ることになっています。これまでのところ、私のプログラムは正しい PNG ヘッダーをチェックし、IDAT チャンクをzlib.decompress()で解凍しています。
このフェーズでは、数日間立ち往生しています。zlib decopress は、画像データをこの状態のままにしました。ここでは、次のような画像の行のバイト表現があります。
すべての行は、0x00、0x04、0x02、または 0x01 のいずれかの 1 バイトで始まります。0x00 は行が「生データ」にあることを意味し、次のバイトがピクセルの R、G、または B を表していることを意味し、行の終わりまで続きます (実際の改行はありませんが、「ヘッダーバイト")。0x04 または 0x02 しかし、私が読んだように、ハフマンコーディングでコーディングされており、ここに私の質問があります:
これらの行をデコードする方法は? これにはpython関数がありますか(インフレートステップ用のzlib解凍があるように)また、最後の2行は0x01で始まります。これは、Deflateについて読んだときに、「これがストリームの最後のブロックであること」を意味するはずです。画像の最後の行だけでなく、最後の 2 行にあるのはなぜですか? また、最後の 2 行のデータも紛らわしいものがあります。これは、一部のピクセルが明らかに「生の」表現であるためです。
どうもありがとう、私はすでにどこでも答えを見つけようとしました...
ボイタ