在移动app开发过程中,图片往往是不可或缺的资源。从磁盘上加载一张图片,到显示到屏幕上,中间经过了一些复杂的过程,其中非常重要的一步就是对图片的解压缩。那么,什么是图片解压缩?为什么要对图片解压缩?如何对图片解压缩?下面从这几个问题进行分析。
在解决上面的问题前,首先了解一些简单的概念。
和解压缩相关的概念
jpeg 和 png
- jpeg: jpeg 是一种有损压缩的图片格式,不支持透明通道。有损压缩是不可逆的,也就是说,不能从一张有损压缩的图片得到原图片数据。
- png: png 是一种无损压缩的图片格式。相对于jpeg来说,png 支持透明通道。因为png是无损压缩的,所以可以从png图片得到原图片数据。
在iOS开发中,苹果提供了专门的api来 生成jpeg格式的图片和png格式的图片。
NSData * imageData = UIImageJPEGRepresentation(image, 0.9); 第二个参数就是压缩质量,官方推荐的系数是0.9。
NSData *imageData = UIImagePNGRepresentation(image);
从api 也可以看出 jpeg 是有损压缩,png 是无损压缩。
bmp 格式的图片
BMP,全称是bitmap,也是一种图片格式。bitmap 和 jpeg以及png最大的区别就是,bitmap是无损压缩的。由于是无损压缩的,相同的图片,bitmap格式的图片体积,要比jpeg和png格式的图片大很多。看看苹果开发者文档中对bitmap的描述:
A bitmap image (or sampled image) is an array of pixels (or samples).
Each pixel represents a single point in the image. JPEG, TIFF, and PNG graphics files are examples of bitmap images.
实际上,bitmap图片就是一个像素数组,每一个像素代表图片上的一个点。
显示在屏幕上的图片,实际上就是由一个个的像素点组成的。因此,如果一张jpeg或者png格式的图片想要显示到屏幕上,需要得到该图片的像素数组,这个过程实际上就是解压缩。
这里可能会有个疑惑,既然jpeg、png格式的图片需要解压缩才能显示到屏幕上,为什么不直接使用bitmap格式的图片呢?原因上面也说了,bitmap格式的图片体积要远远大于jpeg和png格式的图片。从一个简单的例子来看下。
这张图片是项目中使用到的一张png格式的图片,大小是2KB,尺寸为48px * 44px。如果一张尺寸为48px*44px,bitmap格式的图片体积是多大呢?
48 * 44 * bytesPerPixel (4) ,大约8KB左右。
在介绍 bytesPerPixel 之前,首先了解一下颜色空间的概念。
颜色空间
在iOS 开发中,一个颜色通常由一组数字来表示。比如1 0 0 ,1 1 1。而颜色空间的作用就是告诉系统如何来解析该颜色。比如说在RGB颜色空间下,1 0 0 表示的红色,而在 BGR 颜色空间下,1 0 0 表示的就是蓝色。由此可知,脱离了颜色空间,那么用来表示颜色的数字将变得毫无意义。iOS 设备中,通常使用的是RGB颜色空间。在程序中需要使用RGB颜色空间时,苹果已经提供了相应的api来创建颜色空间,代码如下:
static CGColorSpaceRef space;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
space = CGColorSpaceCreateDeviceRGB();
});
return space;
核心api 是 CGColorSpaceCreateDeviceRGB: