跳轉到內容

分形/png

來自華夏公益教科書

PNG 特性

  • 對於 png,顏色深度範圍可以從每畫素 1 位元到 64 位元
  • 所有 PNG 影像都包含單個靜態影像
  • 1、2、4 和 8 位元調色盤支援(如 GIF)
  • 1、2、4、8 和 16 位元灰度支援
  • 8 位元和 16 位元每樣本(即 24 位元和 48 位元)真彩色支援
  • 8 位元和 16 位元模式下的完全 alpha 透明度
  • “調色盤 alpha”模式,有效地將普通 RGB 調色盤轉換為 RGBA
  • 伽馬校正用於跨平臺“亮度”控制



png 檔案版本

[編輯 | 編輯原始碼]

PNGN = PNG N 位每顏色(= 通道數 * 每通道位數)

  • PNG8 具有 2^8 = 256 種灰度或 256 種索引顏色,具有 8 位樣本,通常意味著不透明或具有 GIF 式二進位制透明度,但有時也包括半透明度[1]
  • PNG16
    • 灰色
      • 此類影像通常僅用於科學、醫學和電影行業
      • 它將顏色空間均勻地分成 種灰度[2]
      • 請注意,當顯示裝置不支援 16 位時,它可能會被轉換為 8 位以進行顯示。任何大於 256 的值將簡單地被裁剪為 255。[3]
  • PNG24 的顏色深度為 8 x 3 個通道(RGB),即每畫素顏色為 24 位 = 種總顏色,2^8 = 256 種灰度 = 真彩色
  • PNG32 的顏色深度為 8 x 4 個通道(RGBA),即每畫素顏色為 32 位 = 種顏色 = 真彩色和 alpha
  • PNG48
    • RGBA:顏色深度為 12 x 4 個通道(RGBA),即每畫素顏色為 48 位 = 種顏色 = 真彩色和 alpha
    • RGB
  • PNG64 的顏色深度為 16 x 4 個通道(RGBA),即每畫素顏色為 64 位 = 種顏色

關鍵詞

[編輯 | 編輯原始碼]
  • 樣本 = 影像中通道和畫素的交點。
  • 樣本深度 = 用於表示樣本值的位數。在索引顏色 PNG 影像中,樣本儲存在調色盤中,因此樣本深度始終為 8,這是調色盤的定義。在其他型別的 PNG 影像中,它與位深度相同
  • 標記影像 是明確分配了顏色配置檔案的影像,如影像格式定義的那樣。這通常透過包含國際色彩聯盟 (ICC) 配置檔案 [ICC] 來完成。[4]

檔案格式

[編輯 | 編輯原始碼]
  • PNG 檔案以 8 位元組簽名(檔案頭)開頭
  • 在頭之後,是一系列塊


一個塊由四部分組成

  • 長度(4 位元組,[5] 大端),
  • 塊型別/名稱(4 位元組[6]
  • 塊資料(長度位元組)
  • CRC(迴圈冗餘校驗/校驗和;4 位元組[5])。CRC 是一個網路位元組序 CRC-32,它根據塊型別和塊資料計算得出,但不包括長度。
長度 塊型別 塊資料 CRC
4 位元組 4 位元組 長度 位元組 4 位元組


檔案頭

[編輯 | 編輯原始碼]
PNG 影像 使用 十六進位制編輯器 應用程式在 Ubuntu 中檢視。

PNG 檔案的前 8 個位元組是 8-位元組 簽名[7](魔術簽名),具有以下(十進位制)值”

  DEC: 137 80 78 71 13 10 26 10
  HEX:  89 50 4E 47 0D 0A 1A 0A 
  ASC:  NA  P  N  G \r \n NA \n 
值(十六進位制 用途
89 最高位設定為檢測不支援 8 位資料 的傳輸系統,並降低文字檔案被錯誤地解釋為 PNG 或反之的可能性。
50 4E 47 ASCII 中,字母 PNG,允許人們在文字編輯器中檢視時輕鬆識別格式。
0D 0A 一個 DOS 風格的 換行符 (CRLF) 用於檢測資料的 DOS-Unix 換行符轉換。
1A 在 DOS 環境下,使用 type 命令顯示檔案時,用於停止顯示的位元組——檔案結束符 字元。
0A 用於檢測 Unix-DOS 換行符轉換的 Unix 風格換行符 (LF)。

關鍵塊

[編輯 | 編輯原始碼]
  • IHDR 必須是第一個塊;它包含(按順序)影像的
    • 寬度(4 位元組)
    • 高度(4 位元組)
    • 位元深度(1 位元組)位元深度是一個單位元組整數,表示每個樣本或每個調色盤索引的位數(不是每個畫素)。有效值為 1、2、4、8 和 16,但並非所有值都允許用於所有顏色型別。請參閱下表[8]
    • 顏色型別(1 位元組,值為 0、2、3、4 或 6)
    • 壓縮方法(1 位元組,值為 0)
    • 過濾方法(1 位元組,值為 0)
    • 交錯方法(1 位元組,值為 0“無交錯”或 1“Adam7 交錯”)(總共 13 個數據位元組)。[9]
  • PLTE 包含調色盤:顏色列表。
  • IDAT 包含影像,它可能在多個 IDAT 塊中分割。這種分割會稍微增加檔案大小,但可以以流方式生成 PNG。IDAT 塊包含實際的影像資料,即壓縮演算法的輸出流。[10]
  • IEND 標記影像結束;IEND 塊的資料欄位有 0 位元組/為空。[11]


PNG 顏色型別
顏色
型別
名稱 二進位制 掩碼 十進位制值 二進位制值
  A C P
0 灰度 0 0 0 0 0 0002
2 真彩色 0 0 1 0 顏色 2 0102
3 索引 0 0 1 1 顏色,調色盤 3 0112
4 灰度和 alpha 0 1 0 0 alpha 4 1002
6 真彩色和 alpha 0 1 1 0 alpha,顏色 6 1102



顏色型別和位元深度的允許組合[9]
顏色型別 通道 允許的每個通道的位數
1 2 4 8 16
索引 1 1 2 4 8
灰度 1 1 2 4 8 16
灰度和 alpha 2 16 32
真彩色 3 24 48
真彩色和 alpha 4 32 64

輔助塊

[編輯 | 編輯原始碼]
  • bKGD 給出預設背景顏色。它旨在在沒有更好的選擇時使用,例如在獨立的影像檢視器中(但不在 Web 瀏覽器中;有關更多詳細資訊,請參閱下文)。
  • cHRM 給出顯示色度 座標的原色白點
  • dSIG 用於儲存數字簽名。[12]
  • eXIf 儲存Exif 元資料。[13]
  • gAMA 指定伽瑪。gAMA 塊僅包含 4 個位元組,其值表示伽瑪值乘以 100,000;例如,伽瑪值 1/3.4 計算為 29411.7647059 ((1/3.4)*(100,000)) 並轉換為整數(29412)以進行儲存。[14]
  • hIST 可以儲存直方圖,或影像中每種顏色的總數。
  • iCCP 是一個 ICC 顏色配置檔案[15]
  • iTXt 包含關鍵字和UTF-8 文字,以及可能壓縮和翻譯的編碼,用語言標記 標記。可擴充套件元資料平臺 (XMP) 使用此塊,關鍵字為“XML:com.adobe.xmp”。
  • pHYs 儲存預期的畫素大小(或畫素縱橫比);pHYs 包含“每單位畫素,X 軸”(4 位元組)、“每單位畫素,Y 軸”(4 位元組)和“單位說明符”(1 位元組),總共 9 個位元組。[16]
  • sBIT(有效位)指示源資料的顏色精度;此塊包含總共 1 到 5 個位元組,具體取決於顏色型別。[17][18][19]
  • sPLT 建議在全範圍顏色不可用時使用的調色盤。
  • sRGB 表示使用標準sRGB 顏色空間;sRGB 塊僅包含 1 個位元組,用於“渲染意圖”(為渲染意圖定義了 4 個值——0、1、2 和 3)。[20]
  • sTER 用於立體 影像的立體影像指示器塊。[21]
  • tEXt 可以儲存可以在ISO/IEC 8859-1 中表示的文字,每個塊一個鍵值 對。“鍵”的長度必須在 1 到 79 個字元之間。分隔符為空字元。“值”可以是任何長度,包括零到最大允許的塊大小減去關鍵字和分隔符的長度。“鍵”和“值”都不能包含空字元。開頭或結尾的空格也不允許。
  • tIME 儲存影像最後修改的時間。
  • tRNS 包含透明度資訊。對於索引影像,它儲存一個或多個調色盤條目的 alpha 通道值。對於真彩色和灰度影像,它儲存一個要被視為完全透明的單個畫素值。
  • zTXt 包含壓縮文字(以及壓縮方法標記),其限制與 tEXt 相同。


渲染意圖值(值名稱描述)

  • 0 = 感知 用於優先考慮對輸出裝置色域的良好適應,以犧牲顏色度量精度為代價的影像,例如照片。
  • 1 = 相對色度 用於要求顏色外觀匹配(相對於輸出裝置白點)的影像,例如徽標。
  • 2 = 飽和度 用於優先考慮在犧牲色調和亮度的情況下保留飽和度的影像,例如圖表和圖形。
  • 3 = 絕對色度 用於要求保留絕對顏色度量的影像,例如為不同輸出裝置(校樣)準備的影像預覽。


非常簡單的 PNG 檔案的結構
89 50 4E 47 0D 0A 1A 0A
PNG 簽名
IHDR
影像頭
IDAT
影像資料
IEND
影像結束
表示一個紅色畫素的最小 PNG 檔案的內容
十六進位制 作為字元

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
00 00 00 01 00 00 00 01 08 02 00 00 00 90 77 53
DE 00 00 00 10 49 44 41 54 08 D7 63 F8 CF C0 00
00 03 01 01 00 18 DD 8D B0 00 00 00 00 49 45 4E
44 AE 42 60 82

.PNG........IHDR
..............wS
.....IDAT..c....
.............IEN
D.B`.

IHDR 塊
塊中的偏移量 十六進位制值 十進位制值 文字 意思
0 0x0D 13 IHDR 塊有 13 個位元組的內容
4 0x49484452 IHDR 標識一個頭塊
8 0x01 1 影像寬 1 畫素
12 0x01 1 影像高 1 畫素
16 0x08 8 每個畫素(每個通道) 8 位
17 0x02 2 顏色型別 2(RGB/真彩色)
18 0x00 0 壓縮方法 0(唯一接受的值)
19 0x00 0 過濾方法 0(唯一接受的值)
20 0x00 0 不交錯
21 0x907753DE 塊的型別和內容的 CRC(但不包括長度)
IDAT 塊
塊中的偏移量 十六進位制值 意思
0 0x10 IDAT 塊有 16 個位元組的內容
4 0x49444154 標識一個數據塊
8 0x08 使用 256 位元組視窗的 DEFLATE 壓縮方法[22]
9 0xD7 ZLIB FCHECK 值,未使用字典,最大壓縮演算法[22]
10 0x63F8CFC00000 使用靜態哈夫曼程式碼的壓縮 DEFLATE 塊,解碼為 0x00 0xFF 0x00 0x00[23]
16 0x03010100 ZLIB 校驗值:未壓縮資料的 Adler32 校驗和[22]
20 0x18DD8DB0 塊的型別和內容的 CRC(但不包括長度)

以類似於 十六進位制編輯器 的方式顯示,左側顯示以 十六進位制格式 顯示的位元組值,右側顯示來自 w:ISO-8859-1 的等效字元,無法識別的字元和控制字元用句號代替。此外,PNG 簽名和各個塊用顏色標記。請注意,它們很容易識別,因為它們具有可讀的型別名稱(在本例中為 PNG、IHDR、IDAT 和 IEND)。


  PNG Signature(8 bytes): 89 50 4E 47 0D 0A 1A 0A
    =======Chunk start=======
    IHDR Chunk:
        IHDR chunk length(4 bytes): 00 00 00 0D
        IHDR chunk type(Identifies chunk type to be IHDR): 49 48 44 52
        Image width in pixels(variable 4): xx xx xx xx
        Image height in pixels(variable 4): xx xx xx xx
        Flags in the chunk(variable 5 bytes): xx xx xx xx xx
        CRC checksum(variable 4 bytes): xx xx xx xx 
    =======Chunk end=======
    
 

讀取 png

[編輯 | 編輯原始碼]

使用 od 程式讀取 png

od -c test.png | head -4

示例輸出

0000000 211   P   N   G  \r  \n 032  \n  \0  \0  \0 004   C   g   B   I
0000020   P  \0     002   + 325 263 177  \0  \0  \0  \r   I   H   D   R
0000040  \0  \0  \0   `  \0  \0  \0   `  \b 006  \0  \0  \0 342 230   w
0000060   8  \0  \0  \0       c   H   R   M  \0  \0   z   %  \0  \0 200

程式

  • pngcheck,由 Greg Roelofs 編寫的命令列程式
pngcheck -c *.png
pngcheck -cvt *.png

程式碼

[編輯 | 編輯原始碼]

八度音階

[編輯 | 編輯原始碼]

八度音階 程式碼,用於建立陣列(記憶體影像)並將其儲存到檔案中[24]

# octave m-file based on the m-file by Chris King
# http://www.dhushara.com/DarkHeart/Viewers/source/siegel.m
# an MyImage here is a matrix for 24 bit (3 byte) colors

# load packages
pkg load image; # imwrite
pkg load miscellaneous; # waitbar

# constan values 
nx = 480;
ny = 480;
MyImage = zeros(ny,nx,3); # 2D matrix filled with zeros
magc=0.65;
dSide=1/magc;
Zxmin = -dSide;
Zxmax = dSide;
Zymin = -dSide;
Zymax = dSide;

stepy = (Zymax - Zymin)/(ny - 1);
stepx = (Zxmax - Zxmin)/(nx - 1);

# computations 
waitbar(0,'Please wait...'); # info 
for iy = 1:ny
  Zy = Zymax - iy*stepy; # invert y axis
  for ix= 1:nx
    Zx = Zxmin + ix*stepx;
    if(Zy>0 && Zx>0)  # first quadrant should be in upper right position
    MyImage(iy,ix,2)=255-MyImage(iy,ix,2);
    endif;
  end # for ix
  waitbar(iy/ny);
end # for iy
# 
image(MyImage); # display image 
imwrite(MyImage,'s.png' ); # save image to the file

影像集合

[編輯 | 編輯原始碼]


建立 png 檔案

[編輯 | 編輯原始碼]


檢查 png 檔案

[編輯 | 編輯原始碼]
file p.png


ICC 嵌入配置檔案

編輯 png 檔案

[編輯 | 編輯原始碼]
  • 十六進位制編輯器
    • 由於壓縮演算法的存在,在十六進位制編輯器中編輯畫素資料幾乎是不可能的[25]
    • 可以編輯標題,
  • 使用線上 crc 計算器計算 png 的校驗和
  • 使用 TS/JS[26]
  • pngcheck


十六進位制轉儲

hexdump --canonical p.png 


顯示官方 libpng 規範[27]中描述的 PNG 標題的輸出

  • 以 8 位元組塊處理 PNG 檔案
  • PNG 規範以十進位制形式記錄,根據十六進位制轉儲文件,它由 %d 表示
  • 在每個整數後面新增一個空格,使輸出完美
hexdump -n8 -e'8/1 "%d ""\n"' p.png


ICC 配置檔案任務[28]

  • 從檔案中提取 ICC 配置檔案
  • 要刪除 ICC 配置檔案
  • 要嵌入 ICC 配置檔案


從檔案中提取 ICC 配置檔案

exiftool -icc_profile -b -w icc somefile.png

要刪除 ICC 配置檔案

pngcrush -rem iCCP foo.png result.png

另請參閱

[編輯 | 編輯原始碼]

參考資料

[編輯 | 編輯原始碼]
  1. stackoverflow 問題:png8 和 png24 之間的區別?
  2. 位深度,作者 Michael Reichmann,2011 年 12 月 2 日
  3. stackoverflow 問題:16 位灰度 png
  4. csswg:css-color-4 術語
  5. a b Laphroaig, Manul (31 October 2017). PoC or GTFO. ISBN 9781593278984. 每個塊包含四個部分:長度、塊型別、塊資料和 32 位 CRC。長度是一個 32 位無符號整數,表示僅塊資料欄位的大小
  6. Laphroaig, Manul (31 October 2017). - PoC or GTFO. ISBN 9781593278984. 塊型別是 32 位 FourCC 程式碼,例如 IHDR、IDAT 或 IEND。 {{cite book}}: Check |url= value (help)
  7. W3C 20035.2 PNG 簽名.
  8. 行動式網路圖形 (PNG) 規範(第三版)W3C 第一個公開工作草案 2022 年 10 月 25 日
  9. a b W3C 200311.2.2 IHDR 影像頭
  10. W3C 200311.2.4 IDAT 影像資料.
  11. W3C 200311.2.5 IEND 影像尾部.
  12. Thomas Kopp (17 April 2008). "PNG 數字簽名:擴充套件規範".
  13. "PNG 1.2 規範擴充套件,版本 1.5.0". ftp-osl.osuosl.org.
  14. W3C 2003, 11.3.3.2 gAMA 影像伽瑪.
  15. w3.org png 規範 iCCP
  16. W3C 2003, 11.3.5.3 pHYs 物理畫素尺寸.
  17. W3C 2003, 11.3.3.4 sBIT 有效位.
  18. "PNG(行動式網路圖形)規範\版本 1.0". w3.org. 檢索於 2022 年 5 月 30 日. 4.2.6. sBIT 有效位,總共 13 位元組 - 顏色型別 2 和 3 總共 6 位元組
  19. Roelofs 2003, 有效位 (sBIT).
  20. "PNG 規範:塊規範".
  21. "2006 年 PNG 新聞". Libpng.org.
  22. a b c Deutsch,L. Peter;Gailly,Jean-Loup (1996 年 5 月). "rfc1950". datatracker.ietf.org. 檢索於 2021-08-18.
  23. Deutsch,L. Peter (1996 年 5 月). "rfc1951". datatracker.ietf.org. 檢索於 2021-08-18.
  24. Chris King 的 Matlab 中的 Sigel 盤
  25. 使用十六進位制編輯器破解影像檔案 psychocod3r 2019 年 4 月 15 日
  26. Mathilde E. 2020 年 9 月 8 日:理解和解碼 PNG,在 TypeScript 中的示例
  27. Hexdump 如何工作。Hexdump 幫助你調查二進位制檔案的內容。瞭解 hexdump 的工作原理。作者:Seth Kenlon (Red Hat 團隊) 2019 年 8 月 12 日
  28. PNG-ICC-測試
華夏公益教科書