13

PNG形式を理解しようとしています。

このPNG画像を検討してください:

ここに画像の説明を入力

画像はこちらから

Hex Editor では、次のようになります。

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 80 00 00 00 44 08 02 00 00 00 
C6 25 AA 3E 00 00 00 C2 49 44 41 54 78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F 
B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 
00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 
00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 
73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 
C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 
01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 8C 37 DB 
68 03 20 FB ED 96 65 00 00 00 00 49 45 4E 44 AE 42 60 82

同等の文字:

‰PNG........IHDR...€...D.....Æ%ª>...ÂIDATx^íÔ..Ã0.@Ñ·4Ýÿÿo³tVê‰.l(sâª4I.‡ÖþØ{‰
»R.;‡þ..€.......@....... ....€.......@....... ...Ô^jdK”õ˜|Ñô’\\>Ïœ?sqX_¯
‹y[î–¶GëñêÑζãu;湕.ÇÎ.9ɯÆ3“{f7Ï«¿ùÉ/.€.......@....... ....€.......@....... ..Œ7Ûh. 
ûí–e....IEND®B`‚

次の HEX エディタのスクリーンショットにも同じことが示されています。

ここに画像の説明を入力

この画像をリバース エンジニアリングして、ヘッダー部分と RGB ピクセル値を抽出しようとしています。PNGhereについて読みましたが、これまでのところ、この画像について次のことに注意しました。

IHDR チャンクは最初に表示される必要があります。を含む:

Width:              4 bytes
Height:             4 bytes
Bit depth:          1 byte
Color type:         1 byte
Compression method: 1 byte
Filter method:      1 byte
Interlace method:   1 byte

以下では、HEX データを順番に読み始めています。

1- 最初の 8 バイト: これは 8 バイトの署名です。

 89 50 4E 47 0D 0A 1A 0A

同様に、これは次のとおりです。HEX エディターで表示される %PNG

有効な PNG イメージには、IHDR チャンク、1 つ以上の IDAT チャンク、および IEND チャンクが含まれている必要があります。

2- チャンク: 長さ

 00 00 00 0D

3チャンク:チャンクタイプ

 49 48 44 52

これがIHDRです。

http://www.w3.org/TR/PNG-Chunks.html

4- チャンク: 画像の幅 (10 進数 128)

00 00 00 80

5- チャンク: 画像の高さ (10 進数 68)

00 00 00 44

6- チャンク: BIT DEPTH (1 バイト)

08

7- チャンク: カラータイプ

02

8-圧縮方法

00

9- フィルター方法:

00

10- インターレース方式:

00

11- 次のデータは何ですか?

C6 25 AA 3E 00 00 00 C2

12-- IDAT

49 44 41 54

13- このデータは何ですか (IDAT 後):

78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 100 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A F 64 4B 9 C 4 C 5 C 94 F 94 3E CF 9C 3F 73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 8C 37 DB 206 ED0 6 0 FB0 3 00 00

14- IEND:

49 45 4E 44

15 - 最後の 4 バイト

 AE 42 60 82

これは何 ?

上記のポイント11、13、および15を理解するのに役立つものはありますか? そして、ピクセル値はどこにありますか? 画像には(128 x 68ピクセル)があります

これらの詳細を知る目的:

これらの詳細がわかったら、独自の 16 ビット PNG 画像を生成します。私はすでにピクセル値を持っているので、私の仕事はヘッダーなどを導入する
ことです。この仕事を実行できるソフトウェアがあるかどうかはわかりません。

アップデート

圧縮が原因で、ピクセル値を特定できないことがわかりました。

OpenCVでファイルを書き込んでpngとして保存できるという考えが浮かびました。さて、私の直接の質問は次のとおりです。グレースケールの16ビットピクセル値を持つバイナリファイルがあります。これを OpenCV で 16 ビット PNG として記述できますか?

4

3 に答える 3

4

PNG 画像が実際に何であるか、および画像がファイル内で実際にどのように表現されているかを知ることは興味深いかもしれませんが、PNG ファイルを生成するためにこれを知る必要はありません。

PNG は可逆圧縮を使用することに注意してください。つまり、1 ピクセルあたり 2 バイトは得られません。

プログラムで画像を生成し、そこにある多くのライブラリを使用して PNG 形式で出力できます。たとえば、OpenCV でイメージを作成し、それを で出力できますimWrite。パラメータの 1 つを使用すると、PNG に出力できます。


グレースケールの 16 ビット ピクセル値がある場合は、それらをMat.

次に、それを IplImage に変換します: Converting cv::Mat to IplImage*

その後、ファイルに出力できます。

于 2012-06-19T11:58:49.110 に答える
3

私はあまり注意深く見ていませんでしたが、構造を見てから...

Q11。C6 25 AA 3E = CRC32 00 00 00C2=次のチャンクのサイズ

Q13。以前に参照したpng仕様を確認してください。これは、圧縮が適用されていることをすでに知っているIDATチャンクのように見えます。

Q15。AE 42 60 82 = CRC32

于 2012-10-23T21:02:51.957 に答える
3

完全を期すために(eboixの答えはその場で正しいです)

11- 次のデータは何ですか?

C6 25 AA 3E 00 00 00 C2

各チャンクはCRC (4 バイト) で終わり、その長さを示す 4 バイトで始まります。したがって、C6 25 AA 3Eは前のチャンク (IHDR) の CRC であり、00 00 00 C2(194) は次の (IDAT) チャンクの長さです。

同様に、最後の 4 バイトは IEND チャンクの CRC です。

于 2012-06-19T13:53:34.093 に答える