Bitmap的decode底层源码流程分析。

研究c++源码之前要先细读一下BitmapFactory.Options的几个关键属性的注释。

核心:其实这个类就是BitmapFactory加载bitmap的一个配置(没看到可以自己去研读注释)。

inDensity:;当前配置中设置的密度大小;decodeResource方法下默认取图片所在目录的密度大小。
inTargetDensity:预期加载一个inTargetDensity密度大小的bitmap,这个bitmap按理是会被绘制在同样密度的Canvas上,decodeResource方法下默认取屏幕密度。
inScreenDensity:This is purely for applications running in density compatibility code(不是很好翻译)
inScaled:是否可以缩放,默认为true。
缩放逻辑:如果inDensity不等于inScreenDensity,并且inDensity和inTargetDensity不等于0,则吧inDensity放大到等于inTargetDensity(c++层源码可以查看)。

Bitmap.Config inPreferredConfig:颜色模式,其实就是颜色值的存储方式,不解释,太简单。不设置的话会自动根据图片是否包含alpha等和屏幕灰阶深度来选择。
ColorSpace inPreferredColorSpace:色彩空间,WCG广色域(android不支持)、SRGB等,源代码可以查看。不设置的话会自动根据inPreferredConfig以及图片中的颜色来选择。

**

decodeResourceStream

**
1、这里主要就是前面说的自动根据资源文件和屏幕密度设置inDensity和inTargetDensity。
在这里插入图片描述
2、加载bitmap和设置bitmap加载成功后的density。
在这里插入图片描述
3、nativeDecodeAsset对应的c++方法:nativeDecodeAsset。
在这里插入图片描述
4、doDecode方法。
初始化和校验BitmapFactory.Options的参数。
在这里插入图片描述
继续计算一些参数:颜色模式,ninepatch图不允许设置为rgb565,android7以前会出现抖动而ninepatch图同时会拉伸,不允许出现这种效果,对于颜色模式如果出现不明确需要矫正的话都是设为ARGB8888。
在这里插入图片描述
这里尝试分配内存,可能出现java堆和native堆以及javaBitmap大小的情况,然后从流中读取数据并进行图片解码保存到decodingBitmap对象中,**注意这里只有采样率生效 **。
在这里插入图片描述

最后这里,进行了缩放,即实现了inDensity和inTargetDensity之间的缩放。然后分三种情况生成java bitmap对象。第一种就是使用inBitmap属性重复利用内存的方式;第二种是使用Hardware的方式;第三种也是利用bitmap.cppcreateBitmap函数生成一个bitmap对象,注意这个地方的**defaultAllocator**内存分配器,不同系统版本的默认内存分配不一样。

关键点1:整体流程分为参数的赋值校验与计算和图片的解码与缩放。
缩放有采样率的缩放和密度缩放。
解码颜色模式的校验机制。
关键点2:内存占用大小,与颜色模式以及缩放有关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis的bitmap底层数据结构是一个由二进制位组成的字符串,每个二进制位只能是0或1。这个字符串的长度是固定的,即在创建bitmap时就确定了。每个二进制位代表一个数字,这个数字的值就是这个二进制位所在的位置。例如,第0位代表数字0,第1位代表数字1,以此类推。当某个数字被设置为1时,对应的二进制位就被置为1;当某个数字被设置为0时,对应的二进制位就被置为0。这样,我们就可以用bitmap来表示一个数字集合,其中每个数字的出现与否可以用对应的二进制位来表示。 ### 回答2: Redis是一个高性能的非关系型数据库,它支持各种数据结构,包括字符串、哈希表、列表、集合、有序集合等。Bitmap是Redis的其中一个数据结构,它通常用于处理大量的位数据。 Bitmap底层数据结构是一个比特数组,具体来说,Redis使用一个字符串来表示一个Bitmap,每个字符占8个比特位。对于一个大小为N的Bitmap,字符串的长度为(N+7)/8个字符。 Bitmap数据结构支持多种操作,包括位的设置、清除、翻转、计数和位图操作等。 位的设置和清除是Bitmap最基本的操作。设置操作可以将一个比特位设置为1,而清除操作则可以将一个比特位清零。翻转操作可以将一个比特位从0变成1,或从1变成0。 计数操作可以统计一个Bitmap中1的数量,这个操作对于处理海量数据特别有用,比如计算用户在某个时间段内的访问量,可以通过Bitmap记录每个时间点的访问次数,然后对这些Bitmap进行OR运算,即可得到用户在这个时间段内的总访问量。 位图操作则是Bitmap的最大特点。通过位图操作,可以快速地实现各种集合操作,比如交集、并集、差集、子集判断等。比如,可以将两个Bitmap进行OR运算,得到它们的并集,将两个Bitmap进行AND运算,得到它们的交集,将一个Bitmap与另一个非Bitmap进行AND NOT运算,得到它们的差集。 总之,Redis的Bitmap底层数据结构是一个比特数组,通过各种操作可以方便地处理海量的位数据,并实现各种集合操作。这个数据结构可以在很多应用场景下发挥重要作用,包括计数器、高效查询、排重、统计等。 ### 回答3: Redis的bitmap是一种用于处理位操作的数据结构,它可以将一个位序列指定为一个字符串,并提供了许多位操作的命令。Redis中bitmap底层数据结构是一个二进制字符串,也就是一个由0和1组成的长字符串。 在位图中,每个位都代表了一个二进制数字的一个位(0或1)。这样,我们可以通过对位置进行位操作来表示一个数据的状态,比如用位表示是否某一用户访问过某一网站。Redis的bitmap存储方式是将多个二进制字符串连成一个大的字符串,形成bitmap。 特别值得注意的是,由于Redis中的字符串结构支持动态变长,因此可以根据需要来调整动态字符串的长度,这在实际应用中非常灵活和方便。 除此之外,Redis中bitmap的操作也非常丰富,主要包括设置、获取和清除某一位的状态、计数二进制字符串中位值为1的个数、计算多个二进制字符串的位与、位或和位异或等操作。这些操作对于一些需要高效处理二进制数据的应用场景非常有帮助。 总结起来,Redis的bitmap底层数据结构就是一个由0和1组成的二进制字符串,通过一些位操作命令来实现对于二进制字符串的一些设置、获取和计算操作。而在实际应用中,位图可以方便地处理各种二进制数据问题,并且具有高效、灵活等特点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值