zoukankan      html  css  js  c++  java
  • 纹理的像素格式

    在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,比如红色,会去掉一些红色的显示,用同一种红色代替,从而减少内存。

  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/marklove/p/14232240.html
Copyright © 2011-2022 走看看