分形/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
- 伽馬校正用於跨平臺“亮度”控制
PNGN = PNG N 位每顏色(= 通道數 * 每通道位數)
- PNG8 具有 2^8 = 256 種灰度或 256 種索引顏色,具有 8 位樣本,通常意味著不透明或具有 GIF 式二進位制透明度,但有時也包括半透明度[1]
- PNG16
- 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 位元組 |

使用 十六進位制編輯器 應用程式在 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必須是第一個塊;它包含(按順序)影像的PLTE包含調色盤:顏色列表。IDAT包含影像,它可能在多個 IDAT 塊中分割。這種分割會稍微增加檔案大小,但可以以流方式生成 PNG。IDAT 塊包含實際的影像資料,即壓縮演算法的輸出流。[10]IEND標記影像結束;IEND 塊的資料欄位有 0 位元組/為空。[11]
| 顏色 型別 |
名稱 | 二進位制 | 掩碼 | 十進位制值 | 二進位制值 | |||
|---|---|---|---|---|---|---|---|---|
| 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 |
| 顏色型別 | 通道 | 允許的每個通道的位數 | ||||
|---|---|---|---|---|---|---|
| 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 結構
-
PNG 塊中字母大小寫的意思
-
表示單個紅色畫素的非常簡單的 PNG 檔案的二進位制內容
| 89 50 4E 47 0D 0A 1A 0A PNG 簽名 |
IHDR 影像頭 |
IDAT 影像資料 |
IEND 影像結束 |
| 十六進位制 | 作為字元 |
|---|---|
|
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 |
.PNG........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(但不包括長度) |
| 塊中的偏移量 | 十六進位制值 | 意思 |
|---|---|---|
| 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=======
使用 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
- 由 Willem van Schaik 建立的 PngSuite,是 PNG 的“官方”測試套件
- Rich Franzen 的 PNG 畫廊
- 16 位整數 ProPhotoRGB png : saturated-colors.png
file p.png
ICC 嵌入配置檔案
- 十六進位制編輯器
- 由於壓縮演算法的存在,在十六進位制編輯器中編輯畫素資料幾乎是不可能的[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
- ↑ stackoverflow 問題:png8 和 png24 之間的區別?
- ↑ 位深度,作者 Michael Reichmann,2011 年 12 月 2 日
- ↑ stackoverflow 問題:16 位灰度 png
- ↑ csswg:css-color-4 術語
- ↑ a b Laphroaig, Manul (31 October 2017). PoC or GTFO. ISBN 9781593278984.
每個塊包含四個部分:長度、塊型別、塊資料和 32 位 CRC。長度是一個 32 位無符號整數,表示僅塊資料欄位的大小
- ↑ Laphroaig, Manul (31 October 2017). - PoC or GTFO. ISBN 9781593278984.
塊型別是 32 位 FourCC 程式碼,例如 IHDR、IDAT 或 IEND。
{{cite book}}: Check|url=value (help) - ↑ W3C 2003,5.2 PNG 簽名.
- ↑ 行動式網路圖形 (PNG) 規範(第三版)W3C 第一個公開工作草案 2022 年 10 月 25 日
- ↑ a b W3C 2003,11.2.2
IHDR影像頭 - ↑ W3C 2003,11.2.4
IDAT影像資料. - ↑ W3C 2003,11.2.5
IEND影像尾部. - ↑ Thomas Kopp (17 April 2008). "PNG 數字簽名:擴充套件規範".
- ↑ "PNG 1.2 規範擴充套件,版本 1.5.0". ftp-osl.osuosl.org.
- ↑ W3C 2003, 11.3.3.2
gAMA影像伽瑪. - ↑ w3.org png 規範 iCCP
- ↑ W3C 2003, 11.3.5.3
pHYs物理畫素尺寸. - ↑ W3C 2003, 11.3.3.4
sBIT有效位. - ↑ "PNG(行動式網路圖形)規範\版本 1.0". w3.org. 檢索於 2022 年 5 月 30 日. 4.2.6. sBIT 有效位,總共 13 位元組 - 顏色型別 2 和 3 總共 6 位元組
- ↑ Roelofs 2003, 有效位 (sBIT).
- ↑ "PNG 規範:塊規範".
- ↑ "2006 年 PNG 新聞". Libpng.org.
- ↑ a b c Deutsch,L. Peter;Gailly,Jean-Loup (1996 年 5 月). "rfc1950". datatracker.ietf.org. 檢索於 2021-08-18.
- ↑ Deutsch,L. Peter (1996 年 5 月). "rfc1951". datatracker.ietf.org. 檢索於 2021-08-18.
- ↑ Chris King 的 Matlab 中的 Sigel 盤
- ↑ 使用十六進位制編輯器破解影像檔案 psychocod3r 2019 年 4 月 15 日
- ↑ Mathilde E. 2020 年 9 月 8 日:理解和解碼 PNG,在 TypeScript 中的示例
- ↑ Hexdump 如何工作。Hexdump 幫助你調查二進位制檔案的內容。瞭解 hexdump 的工作原理。作者:Seth Kenlon (Red Hat 團隊) 2019 年 8 月 12 日
- ↑ PNG-ICC-測試