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