- 本文章所使用的 Glide 源码版本:4.11.0
上一篇:Glide 三部曲之 Gif 加载原理
开胃菜
- 我的上一篇文章被郭霖的微信公众号转载之后,有小伙伴在下面评论想知道 Glide 是怎么判断图片类型的,今天它来了,带着源码解析过来了
源码解析
- 还是从 GifDrawable 类入手,让我们看看是在什么地方创建了 GifDrawable
- 在这里我们发现了一个叫 ImageHeaderParser 集合,从字面上理解是一个图片头解析器集合
- 方法名叫 getType,返回类型是 ImageType,这里就是获取图片类型的核心代码
- 在这里我们可以看到判断不同图片类型的规则,我们先讲讲 JPG 的判断方式
- 我相信大多数人都涌起了一个疑惑,16位无符号整数是什么意思?点击这个链接告诉你答案
- 我们都知道整数是基本数据类型,而任何数据在计算机都是以二进制的形式存在,而在计算机最小的存储单位是位,每一位不是 0 就是 1,一个字节能存储 8 位以内的二进制数据,这里的符号指的就是减号,有符号的整数第一位标记的就是正或者负,而无符号的整数则没有这种标记位。
- 通过计算,0xFFD8 得出的值是 65496,通过进制转换,我们又找回了一点基础知识,原来我们平时用的整数就是以十进制来显示的
这三句代码其实很简单,就是通过读取标记位来判断图片的类型
接下来让我们看看 Gif 类型是怎么判断的
- 这里的位计算是不是又把大多数人给难住了,其实我们没有必要扣这个细节,看不懂没关系,我们可以直接通过字段的命名来判断
- 在这里我们可以得出一个结论,JPG 的标记位大小只有两个字节,而 GIF 的标记位大小有三个字节,那么问题来了,为什么 GIF 的标记位要三个字节?
- 对比刚刚讲过的 JPG 的标记位
- GIF 的标记位显然要比 JPG 要大,所以 JPG 只需要两个字节就能存储,而 GIF 需要三个字节才能存放得下
这里又补充了一点计算机基础知识,这样是不是好理解多了?
接下来让我们简单看看 Glide 支持图片的类型有哪些?
- 讲到这里就已经结束,接下来让我们总结一下这块的源码
总结
- Glide 判断图片类型其实很简单,读取文件流最前面的几个字节码,这几个字节码代表的是图片类型的标记位,再通过这个标记位来判断图片的格式。