从图片的数据块存储方式来看png分两种

1.索引色模式存储。png8的索引色透明就采取该种方式。该种方式是将颜色存在png的可选模块调色板中,调色板的色彩存储格式为RGB(各1byte)。而图片的数据块里的像素直接存储调色板里的索引值,根据索引寻找对应的颜色及透明色。透明色的指定由PLTE后的tRNS图像透明数据块指定。布尔透明和alpha透明的区别是alpha透明为透明色附加了8位(1byte)的透明级别。tRNS图像透明数据块的长度与调色板对应如下。

PLTE块格式为:


循环


RED:    1byte


GREEN:1byte


BLUE:  1byte


END

tRNS块布尔透明格式为:


循环


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^(常有8、16、32)或有透明通道的4*2^(常有8、16、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/

最新文章

  1. 【翻译】ASP.NET MVC 5属性路由(转)
  2. iOS 学习笔记 六 (2015.03.28)常见错误
  3. 卷积相关公式的matlab代码
  4. C++实现日期类(Date类)
  5. Unity3d:编辑器中运行正常,发布后的exe提示找不到文件
  6. web安全实战
  7. 07-2. A+B和C (15)
  8. SVM阅读资料
  9. 201521123026《Java程序设计》第8周学习总结
  10. android 统计启动时长,标准
  11. 【English 】20190319
  12. HttpSimpleClient连接服务器
  13. webpack4 系列教程(十四):Clean Plugin and Watch Mode
  14. 解决多人开发时使用window.onload的覆盖问题
  15. Linux 下面 Sqlserver 2017 的简单安装
  16. lua 复制table
  17. C# Winform继承窗体打开设计器白屏的一例解决方法
  18. Python linux 上的管理工具 pyenv 安装, pip 使用, python项目(版本分割, 项目分割, 虚拟环境创建)
  19. JS和Java正则表达式验证
  20. 设置树莓派SSH连接因超时闲置断开(转)

热门文章

  1. Matlab中取模(mod)与取余(rem)的区别
  2. 2014.9.25DOM元素操作
  3. apache-tomcat-7 设置最大上传.war文件大小[zhuan]
  4. JavaScriptの例
  5. ndk 编译 boost 库,支持serialization
  6. MyBatis使用DEMO及cache的使用心得
  7. Dijkstra算法模拟讲解
  8. Ping pong(树状数组经典)
  9. POJ 1037 DP
  10. 如何写出专业级OOP程序-----文档注释