png文件格式詳解,獲取文件的修改時間,創作時間


http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm
http://www.360doc.com/content/11/0428/12/1016783_112894280.shtml
https://www.cnblogs.com/lidabo/p/3701197.html
http://blog.csdn.net/bisword/article/details/2777121
http://blog.csdn.net/hherima/article/details/45847043
http://twt35twt.iteye.com/blog/1351626

http://blog.csdn.net/Blues1021/article/details/45007943 (good)
http://blog.csdn.net/u014646950/article/details/51144476

code一個png文件,大致了解下png文件的格式

對於一個PNG文件來說,其文件頭總是由位固定的字節來描述的:

十進制數 137 80 78 71 13 10 26 10
十六進制數 89 50 4E 47 0D 0A 1A 0A

其中第一個字節0x89超出了ASCII字符的范圍,這是為了避免某些軟件將PNG文件當做文本文件來處理。
文件中剩余的部分由3個以上的PNG的數據塊(Chunk)按照特定的順序組成,因此,一個標准的PNG文件結構應該如下:

PNG文件標志|PNG數據塊|...|PNG數據塊

PNG數據塊(Chunk)
PNG定義了兩種類型的數據塊,
一種是稱為關鍵數據塊(critical chunk),這是標准的數據塊,
另一種叫做輔助數據塊(ancillary chunks),這是可選的數據塊。


鍵數據塊定義了4個標准數據塊,每個PNG文件都必須包含它們,PNG讀寫軟件也都必須要支持這些數據塊。
雖然PNG文件規范沒有要求PNG編譯碼器對可選數據塊進行編碼和譯碼,但規范提倡支持可選數據塊。

下表就是PNG中數據塊的類別,其中,關鍵數據塊部分我們使用 (!) 加以區分。
PNG文件格式中的數據塊

數據塊符號 數據塊名稱 多數據塊 可選否 位置限制
IHDR(!) 文件頭數據塊 否 否 第一塊
cHRM 基色和白色點數據塊 否 是 在PLTE和IDAT之前
gAMA 圖像γ數據塊 否 是 在PLTE和IDAT之前
sBIT 樣本有效位數據塊 否 是 在PLTE和IDAT之前
PLTE(!) 調色板數據塊 否 是 在IDAT之前
bKGD 背景顏色數據塊 否 是 在PLTE之后IDAT之前
hIST 圖像直方圖數據塊 否 是 在PLTE之后IDAT之前
tRNS 圖像透明數據塊 否 是 在PLTE之后IDAT之前
oFFs (專用公共數據塊) 否 是 在IDAT之前
pHYs 物理像素尺寸數據塊 否 是 在IDAT之前
sCAL (專用公共數據塊) 否 是 在IDAT之前
IDAT(!) 圖像數據塊 是 否 與其他IDAT連續
tIME 圖像最后修改時間數據塊 否 是 無限制
tEXt 文本信息數據塊 是 是 無限制
zTXt 壓縮文本數據塊 是 是 無限制
fRAc (專用公共數據塊) 是 是 無限制
gIFg (專用公共數據塊) 是 是 無限制
gIFt (專用公共數據塊) 是 是 無限制
gIFx (專用公共數據塊) 是 是 無限制
IEND(!) 圖像結束數據 否 否 最后一個數據塊

這里要補充一個iCCP

為了簡單起見,我們假設在我們使用的PNG文件中,這4個數據塊按以上先后順序進行存儲,並且都只出現一次。

數據塊結構:
PNG文件中,每個數據塊由4個部分組成,如下:

名稱 字節數 說明
Length (長度) 4字節 指定數據塊中數據域的長度,其長度不超過(2^31-1)字節
Chunk Type Code (數據塊類型碼) 4字節 數據塊類型碼由ASCII字母(A-Z和a-z)組成
Chunk Data (數據塊數據) 可變長度 存儲按照Chunk Type Code指定的數據
CRC (循環冗余檢測) 4字節 存儲用來檢測是否有錯誤的循環冗余碼

下面,我們依次來了解一下各個關鍵數據塊的結構吧

IHDR
文件頭數據塊IHDR(header chunk):它包含有PNG文件中存儲的圖像數據的基本信息,並要作為第一個數據塊出現在PNG數據流中,而且一個PNG數據流中只能有一個文件頭數據塊。
文件頭數據塊由13字節組成,它的格式如下表所示。

域的名稱 字節數 說明
Width 4 bytes 圖像寬度,以像素為單位
Height 4 bytes 圖像高度,以像素為單位

Bit depth 1 byte 圖像深度:
索引彩色圖像:1,2,4或8
灰度圖像:1,2,4,8或16
真彩色圖像:8或16

ColorType 1 byte 顏色類型:
0:灰度圖像, 1,2,4,8或16
2:真彩色圖像,8或16
3:索引彩色圖像,1,2,4或8
4:帶α通道數據的灰度圖像,8或16
6:帶α通道數據的真彩色圖像,8或16

Compression method 1 byte 壓縮方法(LZ77派生算法)

Filter method 1 byte 濾波器方法

Interlace method 1 byte 隔行掃描方法:
0:非隔行掃描
1: Adam7(由Adam M. Costello開發的7遍隔行掃描方法)

PLTE
調色板數據塊PLTE(palette chunk)包含有與索引彩色圖像(indexed-color image)相關的彩色變換數據,它僅與索引彩色圖像有關,而且要放在圖像數據塊(image data chunk)之前。

顏色 字節 意義
Red 1 byte 0 = 黑色, 255 = 紅
Green 1 byte 0 = 黑色, 255 = 綠色
Blue 1 byte 0 = 黑色, 255 = 藍色

對於索引圖像,調色板信息是必須的,調色板的顏色索引從0開始編號,然后是1、2……,調色板的顏色數不能超過色深中規定的顏色數
(如圖像色深為4的時候,調色板中的顏色數不可以超過2^4=16),否則,這將導致PNG圖像不合法。
真彩色圖像和帶α通道數據的真彩色圖像也可以有調色板數據塊,目的是便於非真彩色顯示程序用它來量化圖像數據,從而顯示該圖像。

IDAT
圖像數據塊IDAT(image data chunk):它存儲實際的數據,在數據流中可包含多個連續順序的圖像數據塊。
IDAT存放着圖像真正的數據信息,因此,如果能夠了解IDAT的結構,我們就可以很方便的生成PNG圖像。


IEND
圖像結束數據IEND(image trailer chunk):它用來標記PNG文件或者數據流已經結束,並且必須要放在文件的尾部。
如果我們仔細觀察PNG文件,我們會發現,文件的結尾12個字符看起來總應該是這樣的:
00 00 00 00 49 45 4E 44 AE 42 60 82
不難明白,由於數據塊結構的定義,IEND數據塊的長度總是0(00 00 00 00,除非人為加入信息),數據標識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82

拿到一個png文件之后,可以把輔助的


由於PNG中規定除關鍵數據塊外,其它的輔助數據塊都為可選部分,因此,有了這個標准后,我們可以通過刪除png文件中所有的輔助數據塊來減少PNG文件的大小,
只保留IHDR、PLTE、IDAT和IEND數據塊。
(當然,需要注意的是,PNG格式可以保存圖像中的層、文字等信息,一旦刪除了這些輔助數據塊后,圖像將失去原來的可編輯性。)


因為計算CRC需要一些時間,但對於字節較少的區塊一般可以忽略不計。比如對IDAT數據塊做CRC校驗。

==================================

對tIME進行分析:

根據數據塊的組成規則,可以知道

選中的7個字節存儲的數據即為 文件的修改時間

大概猜測時間的存儲方式為:

1,2字節為 年份   0x070xE1 為 2017

3字節為 月            0x04 表示4月

4字節為 日            0x05 表示5號

5字節為 時            0x0A 表示10時

6字節為 分            0x1E表示30分

7字節為 秒            0x2C表示44秒

 =====================================================

文件的創建時間,參考:

http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm

chunk類型的詳細說明,參照 PNG文件格式白皮書。

tEXt的說明:

https://www.w3.org/TR/2003/REC-PNG-20031110/#11tEXt

使用WinHex查看一個包含創作時間的png文件:

可以看到創作時間是 2016.1.20"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM