#每天一个知识点#
当我们在谈论图片解码的时候,我们在谈什么?


我们常见的图片 PNG JPEG 文件,实际上是压缩过的,为了减少空间占用和带宽消耗嘛。
那么屏幕要显示这些图片就必须经过解压,拿到完整的位图数据(像素数组,每个元素代表图片上的一个点)。
在 iOS 开发中呢,解码分四步走:
1. 根据 NSData 对象(从文件读取生成)创建一个 source 对象,source 是待解码数据的输入,解码的过程都是通过它来完成
2. 从 source 中读取图像信息,比如图像格式、元信息等,下一步解码要用
3. 调用解码库解码 source,苹果自带的就是 ImageIO,接口是CGImageSourceCreateImageAtIndex,得到一个 CGImageRef
4. 根据解码后的数据生成 UIImage,它是可以显示的图像对象。释放资源

动态图片的解码也差不多,只是将一帧帧图片都解码生成 UIImage,后面再把所有 UIImage 合并生成一个 AnimatedImage(还是 UIImage 类型)

第三方解码器解码的过程又有所不同,就是不用 source 了,重点放在 BitMap 的获取上
1. 先获取到图像的 BitMap 数据(像素数组)
2. 根据 BitMap 生成 CGImage 数据
3. 重绘。把 CGImage 绘制到一个上下文里,这一步是因为CALayer 和 UIImageView 渲染的时候要求的色彩限定,为了减少渲染消耗和内存消耗,这里重新绘制一波
4. 然后根据上下文 context 生成 UIImage。(当然,也要清理资源)[可怜]
展开
评论