• 纹理的像素格式


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

  • 相关阅读:
    C# winIO32位,64位的使用(运行时要用管理员身份)
    C#实现的三种方式实现模拟键盘按键
    C#打印日志的小技巧
    write wall ping ifconfig mail last traceroute netstat setup mount
    安装常用工具 zip unzip bzip2 gcc gcc++编译器 cmake编译器
    gzip/gunzip tar -zcf/-zxvf zip /unzip bzip2/bunzip2 tar -cjf/tar -xjf
    help
    Asp.Net 高性能框架 SqlSugar.ORM 2.3
    centos 查看版本(转)
    浅谈OCR之Tesseract
  • 原文地址:https://www.cnblogs.com/marklove/p/14232240.html
Copyright © 2020-2023  润新知