参考资料
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不支持)
- 不支持透明。
- 不支持动画。
对部分图像不友好
可借助libjpeg库进行读取。
从cocos2dx源码可以看出,jpg默认是转化成RGB888格式纹理。
// ******************** CCImage.h
bool Image::initWithJpgData(const unsigned char * data, ssize_t dataLen){
......
// we only support RGB or grayscale
if (cinfo.jpeg_color_space == JCS_GRAYSCALE) // 用作灰度图
{
_renderFormat = Texture2D::PixelFormat::I8;
}
else
{
cinfo.out_color_space = JCS_RGB; // 一般情况,转换成RGB888纹理
_renderFormat = Texture2D::PixelFormat::RGB888;
}
......
}
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纹理。
// ******************* CCImage.h
bool Image::initWithPngData(const unsigned char * data, ssize_t dataLen) {
......
color_type = png_get_color_type(png_ptr, info_ptr);
switch (color_type)
{
case PNG_COLOR_TYPE_GRAY:
_renderFormat = Texture2D::PixelFormat::I8;
break;
case PNG_COLOR_TYPE_GRAY_ALPHA:
_renderFormat = Texture2D::PixelFormat::AI88;
break;
case PNG_COLOR_TYPE_RGB:
_renderFormat = Texture2D::PixelFormat::RGB888;
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
_renderFormat = Texture2D::PixelFormat::RGBA8888;
break;
default:
break;
}
......
}
3、GIF格式
Grahpic Interchange Format,图像互换格式。是一种基于LZW算法的无损压缩格式。压缩比一般为2:1,几乎所有相关软件都支持GIF,图像深度为1bit~8bit,因此最多支持256色。早期的网络基本采用的就是GIF来显示图片。
GIF另一个显著特点是支持“帧”动画,即在一个文件中保存多张图片并连续显示。
主要版本:GIF89a、GIF87a。
4、BMP格式
windows的标准图像格式,是一种与硬件设备无关的图像文件格式,存储数据时,图像的扫描方式是从左到右。