纹理的像素格式

在Android的Bitmap.Config中有四个枚举类型:
cocos
/32位真彩色,最真但最耗内存
kCCTexture2DPixelFormat_RGBA8888,
/24位真彩色,去掉了ALPHA通道
kCCTexture2DPixelFormat_RGB888,
/16位色,将RGB压缩在一个字中。绿色多了1位,因为人眼对绿色更敏感。
kCCTexture2DPixelFormat_RGB565,
/8位色,只存ALPHA值,做遮罩图用
kCCTexture2DPixelFormat_A8,
/8位色,只存灰度或者强度值,做灰度图用
kCCTexture2DPixelFormat_I8,
/16位色,只存ALPHA值与强度值,双功能
kCCTexture2DPixelFormat_AI88,
/16位色,RGBA四通道各占4位。
kCCTexture2DPixelFormat_RGBA4444,
/16位色,RGB三通道各占5位,多1位留做ALPHA镂空使用
kCCTexture2DPixelFormat_RGB5A1,
/ PVR的PVRTC4压缩格式
kCCTexture2DPixelFormat_PVRTC4,
/ PVRTC的PVRTC2压缩格式
kCCTexture2DPixelFormat_PVRTC2,

  • ALPHA_8
  • ARGB_4444
  • ARGB_8888
  • RGB_565
    1.ALPHA_8:每个像素都需要1(8位)个字节的内存,只存储位图的透明度,没有颜色信息

2.ARGB_4444:A(Alpha)占4位的精度,R(Red)占4位的精度,G(Green)占4位的精度,B(Blue)占4位的精度,加起来一共是16位的精度,折合是2个字节,也就是一个像素占两个字节的内存,同时存储位图的透明度和颜色信息。不过由于该精度的位图质量较差,官方不推荐使用

3.ARGB_8888:这个类型的跟ARGB_4444的原理是一样的,只是A,R,G,B各占8个位的精度,所以一个像素占4个字节的内存。由于该类型的位图质量较好,官方特别推荐使用。但是,如果一个480800的位图设置了此类型,那个它占用的内存空间是:4808004/(10241024)=1.5M

4.RGB_565:同理,R占5位精度,G占6位精度,B占5位精度,一共是16位精度,折合两个字节。这里注意的是,这个类型存储的只是颜色信息,没有透明度信息

Glide的解码格式是RGB565,Picasso是ARGB8888 ,所以同一个图片,picasso更清晰,但是更耗内存。

作者:大川的川
链接:https://www.jianshu.com/p/b1c77e0bec3d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

BMP格式
1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
4 - 16 色位图
8 - 256 色位图
16 - 16bit 高彩色位图
24 - 24bit真彩色位图
32 - 32bit 增强型真彩色位图
001Eh Compression 1 dword 压缩说明:
0 - 不压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)

0022h Bitmap Data Size 1 dword 用字节数表示的位图数据的大小。该数必须是4的倍数
0026h HResolution 1 dword 用象素/米表示的水平分辨率
002Ah VResolution 1 dword 用象素/米表示的垂直分辨率
002Eh Colors 1 dword位图使用的颜色数。如8-比特/象素表示为100h或者 256.
0032h Important Colors 1 dword 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
调色板数据 根据BMP版本的不同而不同 Palette N * 4 byte 调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)

说明图象数据压缩的类型。其值可以是下述值之一:
BI_RGB:没有压缩;
BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);
BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
BI_BITFIELDS:每个象素的比特由指定的掩码决定。
biBitCount=32 表示位图最多有4294967296(2的32次方)种颜色。这种位图的结构与16位位图结构非常类似,当biCompression成员的值是BI_RGB时,它也没有调色板,32位中有24位用于存放RGB值,顺序是:最高位—保留,红8位、绿8位、蓝8位。这种格式也被成为888 32位图。如果 biCompression成员的值是BI_BITFIELDS时,原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、绿、蓝分量在32位中所占的位置。在Windows 95/Windows 98中,系统只接受888格式,也就是说三个掩码的值将只能是:0xFF0000、0xFF00、0xFF。而在NT系统中,你只要注意使掩码之间不产生重叠就行。(注:这种图像格式比较规整,因为它是DWORD对齐的,所以在内存中进行图像处理时可进行汇编级的代码优化(简单))。

ARGB_8888、ARGB_4444、RGB_565、ALPHA_8深入分析及常见误区纠正
区别体现:
标题中的四种类型为bitmap在内存中存在的四种色彩的存储模式,他们本质区别体现在每种模式下的bitmap内部的每个像素点,在内存中的大小和组成成分的区别。
基础知识:
A->alpha(透明度),R->red(红色),G->green(绿色),B->blue(蓝色)
深入分析(每种模式下的一个像素的具体存储大小):
ARGB_8888:A->8bit->一个字节,R->8bit->一个字节,G->8bit->一个字节,B->8bit->一个字节,即8888,一个像素总共占四个字节,8+8+8+8=32bit=4byte
ARGB_4444:A->4bit->半个字节,R->4bit->半个字节,G->4bit->半个字节,B->4bit->半个字节,即4444,一个像素总共占两个字节,4+4+4+4=16bit=2byte
RGB_565:R->5bit->半个字节,G->6bit->半个字节,B->5bit->半个字节,即565,一个像素总共占两个字节,5+6+5=16bit=2byte
ALPHA_8:A->8bit->一个字节,即8,一个像素总共占一个字节,8=8bit=1byte
计算大小方式:
一张bitmap的大小 = 有多少个像素点 * 每个像素点内存中占用的大小 = 长 * 宽 * 3中讲的各种模式下对应的像素点占用的比特位
例子:计算一张长宽为1000/1000,ARGB_8888格式的一张bitmap的大小:
1000 * 1000 * 4byte = 4000kb = 4M
常见误区:
网上很多人分享的四种格式下的像素大小中,ARGB_4444中每个像素占用了4个字节,有些是2个字节,我自己写了demo,跑了一下,发现创建宽高相同的两张图片,在ARGB_8888,ARGB_4444两种格式下,输出大小是相同的,后来仔细看了下介绍,发现在API level 13之后,ARGB_4444由于图片效果较差等原因,在以该种格式操作图片时,会被ARGB_8888,默认替代,所以实际上demo中的两种格式,都是ARGB_8888格式,在这里给大家说明一下,希望对大家能有帮助。

你可能会见到以下像素格式:
RGBA8888(32位)(kTexture2DPixelFormat_RGBA8888)
RGBA4444(16位)(kTexture2DPixelFormat_RGBA4444)
RGB5_A1(16位)(kTexture2DPixelFormat_RGB5A1)
RGB565(16位)(kTexture2DPixelFormat_RGB565)
RGBA8888:
红色通道,绿色通道,蓝色通道,alpha(透明度)通道各8位。如果想获取做好的图片资粮,使用这种格式最靠谱。
手机上占用内存太大,这个格式占用空间计算:以10241024计算图片占用空间 10241024*4 = 4M
常用地方:整个场景背景图片,大量渐变色的图片。

以RGBA8888格式(20482048)计算内存:
图片占用内存: 2048
204832/8/1000/1000 = 16M
1M = 1000KB; 1KB = 1000字节;1字节 = 8 位;32 = 8 + 8 + 8 + 8 位
2048和2048为长宽
OpenGL ES生成纹理在生成纹理时大小会自动扩展成2的幂次方。不足自动向下调整
例:85
121图片 生成纹理就是 128 * 128 占用内存64k

BGRA8888:
蓝色通道,绿色通道,红色通道,alpha(透明度)通道各8位。同上只不过像素格式顺序不一样,不是特别常用

RGBA4444:
红色通道,绿色通道,蓝色通道,alpha(透明度)通道各4位。对每个通道都有不错的支持,还能保证相对良好的速度和内存占用率。
常用地方:需要有不同的透明度精灵。

RGB888:
红色通道,绿色通道,蓝色通道,各8位。没用alpha通道。
常用地方:用在没有透明度的图片。游戏背景图像

RGB565:(*.jpg是565的一种格式)
红色通道5位,绿色通道6位,蓝色通道5位,这可怜的孩子没有Alpha通道。尽最大努力的给你一个高品质的16位纹理,前提是你不需要透明度的支持。
常用地方:游戏背景图

RGBA5551 (别名:RGB5A1):
红色通道5位,绿色通道5位,蓝色通道5位,Alpha通道1位。RGB通道表现良好,但是Alpha通道就惨了。内存占用和速度上表现不错。
常用地方:精灵需要透明度的表现,但是透明度的表现只有两种:开或关。

RGBA5555:
红色通道5位,绿色通道5位,蓝色通道5位,Alpha通道5位。各方面表现都比较良好

PVRTC2(iPhone的图形芯片(PowerVR MBX)对一种称为 PVRTC 的压缩技术提供硬件支持):
所有颜色和透明度占2个字节(品质可能有点低)

PVRTC4:(ios产品专用)
所有颜色和透明度占4个字节,在ios上基本都用这个格式

PVRTC2_NOALPHA:
RGB占用2个字节,没用ALPHA通道

PVRTC4_NOALPHA:
RGB占用4个字节,没用ALPHA通道

ETC1:
是android通用纹理的压缩格式,几乎所有的android机器都支持,是opengles2.0的标准。不像pvrtc4只是部分powervr的显卡支持。
ETC1图片不支持半透明(有替代方案可以使etc1图片兼容半透明显示),内存占用只有正常RGBA8888的八分之一(一个像素0。5个字节),并具有极高的加载速度。
ETC1的图片大小只跟图片的尺寸有关系,在大小上无法媲美jpg或png8的图片。
RGBA各占用0.5个字节

S3TC:(dds的一种格式):
是wp8手机支持的通用纹理压缩格式。RGBA各占用0.5个字节
RBGA8888其他RGB格式,不能被显卡所认可,需要开辟临时内存来读取,假如是2048*2048占用内存16M,读取的时候会临时增到32M。渲染完成,又变为16M
pvr, etc1,s3tc,可以被显卡所认可,而不需要开辟临时内存来读取,所以即便同为argb8888格式,pvr也会比png有效率。虽然不会节约程序稳定的运行内存,但是会避免加载大量图片时内存暴涨。

格式压图原理:

RBGA8888 R 8位 2^8 = 256 可以表现出来256种不同的红色
RBGA5555 R 8位 2^5 = 32 可以表现出来32种不同的红色
如果RBGA8888转换为RBGA5555,比如红色,会去掉一些红色的显示,用同一种红色代替,从而减少内存。

原文地址:https://www.cnblogs.com/marklove/p/14232240.html