参考资料
https://www.cnblogs.com/yuluoxingkong/p/10681253.html

如果图像的原始RGBA数据直接存储到文件中会导致文件非常大,比如50005000的24位RGB图,大小就达到了70MB,这非常占用空间,极不利于文件的存储和传输。如果采用zip、rar的通用算法来压缩,压缩效果将非常有限,因为它并不是针对图像数据的设计的,于是就有了gif、jpg、png等图片格式的存在,可以这样总结:
*jpg、png之于图像,相当于zip、rar之于普通文件。

一、有损/无损压缩

有损压缩是对图像数据的“优化”,保留较多的亮度信息,而将色相和色纯度的信息和周围的像素进行合并,合并的比例影响到最终的压缩比,由于数据的减少,压缩比会很高,图像质量也会相应下降。有损压缩是不可逆的,压缩后的文件时无法恢复成原文件。
无损压缩是对图像数据存储的“优化”,采用某种算法表示重复的数据信息(是不是想起了Huffman编码),从而达到数据量的减少,压缩后的文件是可以完全复原的,完全不会影响图像数据本身,图像细节也就不会有任何损失。
有损压缩可以减少图像在内存和磁盘中的占用空间,无损压缩并不能减少图像在内存中的占用空间。
有损压缩的压缩比达到10:1,甚至200:1,而无损压缩一般为2:1、5:1。

类型 优点 缺点 相同图片大小比较
BMP 无损压缩,品质最好 文件太大 152K
GIF 支持动画 最多256色,画质差 53K
PNG 支持透明度 画质中等 202K
JPG 极高压缩比 画质损失 84K

二、常见格式

1、JPG格式

JPEG(Joint Photographic Experts Group),指的是JPEG标准,是一种针对照片影像而广泛使用的有损压缩格式,常用的扩展名有.jpg、.jpeg、.jpe、.jfif、.jif,其中.jpg最常用。因为是采用有损压缩算法,以牺牲部分画面细节来缩小文件体积,可以达到很高的压缩比(10:1,甚至200:1),所以文件体积会比较小,一般为几十KB。

优点

  • 高性价比
    • 极高压缩比的同时可以保证图片的品质。
    • 适合存储相机照片。
  • 调节压缩比

    • 支持调节压缩比,灵活的选择图片最终文件大小。

      缺点

  • 有损压缩

    • 每一次图片的压缩都会损失部分原图像品质。
    • 不适合用来显示高清晰度的图像。
    • 不宜作为图片的备份格式(因为是有损压缩)。
    • 2000年推出了JPG2000标准,增加了无损压缩功能。
  • 功能不够灵活
    • 不支持图片渐进。(标准JPEG不支持)
    • 不支持透明。
    • 不支持动画。
  • 对部分图像不友好

    • 另外还要注意一点,对于颜色较少、色彩对比强烈、有大块颜色相近的区域、实心边框、纯色区域大的“色彩简单”的图像,JPG无法提供理想的压缩效果。
    • 总结成一句话,不适合保存“几何特征强”的图片。

      三种格式

    • 标准JPEG

      • 不支持渐进式,在网页下载时,只能由上而下依序显示图像,直到下载完毕才能看到图像全貌。
    • 渐进式JPEG
      • 支持渐进性,在网页下载时,先呈现图片的粗略外观,慢慢呈现出完整内容。
      • 文件体积比标准JPEG更小。
    • JPEG2000
      • 压缩品质更高,新一代压缩算法
      • 改善在无线传输时,因网络不稳定造成的马赛克现象及位置错乱问题。

可借助libjpeg库进行读取。

从cocos2dx源码可以看出,jpg默认是转化成RGB888格式纹理。

  1. // ******************** CCImage.h
  2. bool Image::initWithJpgData(const unsigned char * data, ssize_t dataLen){
  3. ......
  4. // we only support RGB or grayscale
  5. if (cinfo.jpeg_color_space == JCS_GRAYSCALE) // 用作灰度图
  6. {
  7. _renderFormat = Texture2D::PixelFormat::I8;
  8. }
  9. else
  10. {
  11. cinfo.out_color_space = JCS_RGB; // 一般情况,转换成RGB888纹理
  12. _renderFormat = Texture2D::PixelFormat::RGB888;
  13. }
  14. ......
  15. }

2、PNG格式

便携式网络图形(Portable Network Graphics),是一种采用无损压缩算法的格式,设计目的是为了代替GIF作为更适合网络传输的格式而且无需专利许可,相比于GIF,PNG的压缩比高,生成的文件体积小。

特性

  • 体积小
    • 无损压缩:采用LZ77算法的派生算法进行压缩。获得高的压缩比,不损失数据,它利用特殊的编码方法标记重复出现的颜色数据,有点类似Huffman算法,事实上也确实是LZ77编码和Huffman编码结合,因而对图像颜色并没有影响。
  • 索引彩色模式
    • PNG-8格式与GIF类似,采用8位调色板将RGB彩色图像转换为索引彩色图像。图像中保存的不是RGB值,而是RGB值对应的一个编号。
  • 更优化的网络传输显示
    • 采用流式浏览,在图片完全下载之前提供浏览器者一个基本的图像,然后逐渐清晰起来。
  • 支持透明效果
    • 可以定义256个透明层次,这是GIF和JPG没有的功能。

和JPG的对比,JPG适合存储色彩“杂乱”的拍摄图片,PNG适合几何特征强的图形类图片

三种格式

PNG-8、PNG-24、PNG-32三种格式。

格式 色值 索引色 透明支持
PNG8 256色(2) 支持 索引透明(布尔透明)
alpha透明(8 bits)
PNG24 约1600万色(2) 不支持 不支持
PNG32 约1600万色(2) 不支持 alpha透明(8 bits)

可借助libpng库进行读取,libpng库依赖zlib库(用到常规的压缩算法)。

从cocos源码可以看出,PNG默认会被转化成RGB888/RGBA8888纹理。

  1. // ******************* CCImage.h
  2. bool Image::initWithPngData(const unsigned char * data, ssize_t dataLen) {
  3. ......
  4. color_type = png_get_color_type(png_ptr, info_ptr);
  5. switch (color_type)
  6. {
  7. case PNG_COLOR_TYPE_GRAY:
  8. _renderFormat = Texture2D::PixelFormat::I8;
  9. break;
  10. case PNG_COLOR_TYPE_GRAY_ALPHA:
  11. _renderFormat = Texture2D::PixelFormat::AI88;
  12. break;
  13. case PNG_COLOR_TYPE_RGB:
  14. _renderFormat = Texture2D::PixelFormat::RGB888;
  15. break;
  16. case PNG_COLOR_TYPE_RGB_ALPHA:
  17. _renderFormat = Texture2D::PixelFormat::RGBA8888;
  18. break;
  19. default:
  20. break;
  21. }
  22. ......
  23. }

3、GIF格式

Grahpic Interchange Format,图像互换格式。是一种基于LZW算法的无损压缩格式。压缩比一般为2:1,几乎所有相关软件都支持GIF,图像深度为1bit~8bit,因此最多支持256色。早期的网络基本采用的就是GIF来显示图片。
GIF另一个显著特点是支持“帧”动画,即在一个文件中保存多张图片并连续显示。
主要版本:GIF89a、GIF87a。

4、BMP格式

windows的标准图像格式,是一种与硬件设备无关的图像文件格式,存储数据时,图像的扫描方式是从左到右。