從圖片的數據塊存儲方式來看png分兩種html
1.索引色模式存儲。png8的索引色透明就採起該種方式。該種方式是將顏色存在png的可選模塊調色板中,調色板的色彩存儲格式爲RGB(各1byte)。而圖片的數據塊裏的像素直接存儲調色板裏的索引值,根據索引尋找對應的顏色及透明色。透明色的指定由PLTE後的tRNS圖像透明數據塊指定。布爾透明和alpha透明的區別是alpha透明爲透明色附加了8位(1byte)的透明級別。tRNS圖像透明數據塊的長度與調色板對應以下。url
PLTE塊格式爲: spa
循環 htm
RED: 1byte blog
GREEN:1byte 索引
BLUE: 1byte 圖片
ENDget
tRNS塊布爾透明格式爲: it
循環 table
if(對應調色盤顏色非透明)
0xFF: 1byte
else
0x00: 1byte
END
tRNS塊alpha透明格式爲:
循環
if(對應調色盤顏色非透明)
0xFF: 1byte
else
0x**: 1byte (具體的透明級別共256級)
END
tRNS塊的循環長度爲調色盤的顏色數,至關於調色板顏色表的一個對應表,標識該顏色是否透明,0xFF(255)不透明,0x00(0)全透明。
2.真彩色存儲(非專業術語)。該類存儲不存在調色板(或者有調色板供非真彩色顯示程序用它來量化圖像數據,從而顯示該圖像。),在數據塊的像素裏直接存儲顏色信息。這裏就有常說的RGB_888(24bit)、RGB565(16bit)、RGBA_8888(32bit)、RGBA_4444(16bit)、RGBA5551(16bit)等等。png24及png32都是該類存儲。
從圖片的色彩位數來看經常使用如下幾種
1.png8。這個8理解爲位深,但這個位深可減小。存儲方式可爲索引色存儲。索引色位深可爲1,2,4,8。隨着位深的減小可支持的顏色也減小。可支持8位色彩共256(2的8次方)種顏色。
1.png16。這個8理解爲位深,存儲方式可爲RGB565(16bit)、RGBA_8888(32bit)、RGBA_4444(16bit)、RGBA5551(16bit)。但這個位深可減小。索引色位深可爲1,2,4,8。隨着位深的減小可支持的顏色也減小。可支持8位色彩共256(2的8次方)種顏色。
2.png24。24也理解爲位深,存儲方式爲RGB_888。可支持24位色彩共1600多萬(2的24次方)種顏色。
3.png32。32也理解爲位深,存儲方式爲RGB_888。實際上爲png24+8位的透明通道。一樣支持24位色彩共1600多萬(2的24次方)種顏色。
可是位深是不定的,以上僅僅列舉經常使用的幾種,還能夠是無透明通道的3*2^(常有八、1六、32)或有透明通道的4*2^(常有八、1六、32)。
那麼咱們使用libpng如何判斷png的格式。
/*獲取位深,顏色類型*/
channels = png_get_channels(png_ptr, info_ptr); /*獲取通道數*/
bit_depth = png_get_bit_depth(png_ptr, info_ptr); /* 獲取位深 */
color_type = png_get_color_type(png_ptr, info_ptr); /*顏色類型*/
根據這些咱們能夠由如下表格進行判斷
Bit depth | 1 byte | 圖像深度: 索引彩色圖像:1,2,4或8 灰度圖像:1,2,4,8或16 真彩色圖像:24或32或48 |
ColorType | 1 byte | 顏色類型: 0:灰度圖像 2:真彩色圖像 3:索引彩色圖像 4:帶α通道數據的灰度圖像 6:帶α通道數據的真彩色圖像 |
參考:
http://baike.baidu.com/link?url=FckD48sfXstBMBnODg40OJvyMGNsiEy1-4SbwE_TSN9WK1WFaIkyjVe5d7YeUlbwKaAe_4swGsSg21PFKzAoba
http://www.cnblogs.com/PeunZhang/archive/2013/05/30/3050394.html
http://blog.163.com/iwait2012@126/blog/static/16947232820124411174877/