2012-06-19 47 views
11

嘗試瞭解PNG格式。嘗試從給定的PNG圖像提取像素值

考慮這個PNG圖片:

enter image description here

的影像從here

採取在十六進制編輯器,它看起來像這樣:

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^íÔ..Ã[email protected]Ñ·4Ýÿÿo³tVê‰.l(sâª4I.‡ÖþØ{‰ 
»R.;‡þ..€[email protected] ....€[email protected] ...Ô^jdK」õ˜|Ñô’\\>Ïœ?sqX_¯ 
‹y[î–¶GëñêÑζãu;湕.ÇÎ.9ɯÆ3「{f7Ï«¿ùÉ/.€[email protected] ....€[email protected] ..Œ7Ûh. 
ûí–e....IEND®B`‚ 

同樣示於以下的HEX編輯器的屏幕截圖:

enter image description here

我試圖反向工程此圖像以提取所述報頭部分和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 

下面我開始按順序讀取十六進制數據:

1-第一個8字節:這是8字節簽名

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

相當於這是:%PNG可以在HEX編輯器中看到

有效的PNG圖像必須包含IHDR大塊,一個或多個IDAT塊和一個IEND塊。

2-組塊:長度

00 00 00 0D 

3-組塊:組塊類型

49 48 44 52 

哪個IHDR。

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

4-大塊:圖像的寬度(在十進制128)

00 00 00 80 

5-組塊:圖像的高度(在十進制68)

00 00 00 44 

6-塊:BIT深度(1字節)

08 

7大塊:顏色類型

02 

8壓縮方法

00 

9-篩選方法:

00 

10隔行掃描法:

00 

11-什麼是下面的數據?

C6 25 AA 3E 00 00 00 C2

12-- IDAT

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 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 96 ED 65 00 00 00 00

14- IEND:

49 45 4E 44

15-最後4個字節

AE 42 60 82 

這些是什麼?

有些人可以幫助我理解上面的11,13和15點嗎? Pixel值在哪裏?該圖像是具有(128×68像素)

知道這些細節的目的:

一旦我知道這些細節,我將產生我自己的16位PNG圖像。我已經有像素值,所以我的工作就是引入標題等。
我不知道是否有軟件可以執行此項工作。

UPDATE

我現在明白了,因爲壓縮的,我不能夠找到的像素值。

我知道我可以在OpenCV中編寫一個文件並將其保存爲png。那麼現在我的直接問題是:我有一個二進制文件具有灰度16位像素值。我可以在OpenCV中將它寫爲16位PNG嗎?

回答

3

儘管瞭解PNG圖像的實際內容以及該圖像在文件中如何表現出來可能很有趣,但您無需知道這將生成PNG文件。

請注意,PNG使用無損壓縮,這意味着您不會得到每像素兩個字節。

您可以在程序中生成圖像,並使用許多庫中的圖像以PNG格式輸出圖像。例如,您可以在OpenCV中製作圖像,然後使用imWrite輸出。其中一個參數可以使其輸出到PNG。


如果你有灰度的16位像素值,那麼你可以把它們放入一個Mat

然後再轉換到IplImage結構:Converting cv::Mat to IplImage*

你可以把它輸出到文件。

+0

我剛剛注意到有關壓縮,所以它很好,我不會得到確切的像素值。但你能告訴我關於11和15嗎? – gpuguy

+0

謝謝,你的回答對我很有幫助。我會測試它,然後發佈結果。 – gpuguy

+3

+1但我不完全同意「你只是浪費了你的時間」。瞭解PNG的內部可能不是您目前的任務所必需的,但它仍然在學習。 – leonbloy

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。

3

我沒看太仔細,但是從看結構...

Q11。 C6 25 AA 3E = CRC32 00 00 00 C2 =下一個塊的大小

Q13。 檢查你之前提到的PNG規範,看起來像IDAT塊,你已經知道應用於它的壓縮!

Q15。 AE 42 60 82 = CRC32