4

以下のサンプル画像から、表示のみを目的として黄色の枠線を付けています。

実際の .png ファイルは、3 ピクセル x 3 ピクセルの単純な白黒画像です。私はもともと 2x2 として試してみることを考えていましたが、低/高対高/低の描画ストリームを解釈しようとするのには役に立ちません。少なくともこの方法では、上から黒が 2 つ、白が 1 つ、または下から白が 1 つ、黒が 2 つになります。

したがって、データのチャンクを読み取り、IDAT チャンクに到達し、それ (zlib) をデコードして、次のように 12 バイトを取得します。

00 20 00 40 00 80

では、私の質問ですが、上記はどのようにして 3x3 の白黒サンプルに分解されるのでしょうか...また、パレット形式で保存され、1 のビット深度と 2 のカラー パレットを適切に認識します... color pallet[0 ] は RGBA すべてゼロです。パレット1の RGBA は 255、255、255、0

最終的には、他の複数の深度形式について説明しますが、最も簡単であると予想されるものから始めたかっただけです。

パート II。他の深度形式の処理に関するガイダンスは、特にアルファチャネル (パレットで既に探しているもの) に関して何か特別なことを考慮する必要がある場合に役立ちます。

ここに画像の説明を入力

4

1 に答える 1

5

libpngを使った方が簡単なので、これは学習用だと思います。

問題は、IDAT チャンクを直接解凍すると、実際のバイトを取得するために (フィルタが適用されたため)表示されないデータや変換が必要なデータが得られることです。PNG 形式では、各行はその行に適用されたフィルタを示す追加のバイトで始まり、残りのバイトには行のピクセルが含まれます。

ところで、00 20 00 40 00 806バイトしかありません(あなたが思うように12ではありません)。このデータをバイナリとして表示すると、3 行は次のようになります。

00000000 00100000
00000000 01000000
00000000 10000000

現在、画像はピクセルあたり 1 ビットであるため、3 ピクセルのラインを保存するには 1 バイトが必要です。上位 3 ビットが実際に使用されます (下位 5 ビットは無視されます)。無視されたビットを に置き換えたので、実際のピクセルxが見やすくなったと思います(黒、白):01

00000000 001xxxxx
00000000 010xxxxx
00000000 100xxxxx

この場合、各行の最初のバイトがゼロであるため、フィルターはどの行にも適用されませんでした (フィルターが適用されていないことを意味し、0から までの値はフィルターが適用されたことを意味します)。14

于 2013-11-10T17:25:17.260 に答える