[小笔记] Android 中 Bitmap 的放缩配置

[小笔记] Android 中 Bitmap 的放缩配置

本篇文章中主要讨论 AndroidBitmap 中的放缩有关的 BitmapFactory#Options 设置的配置。

inJustDecodeBounds

这个参数非常有用,在解析编码后的图片文件(PNGJPEG 等等)时,如果添加了这个参数那么就只会解析图片的尺寸,而不会真正的解码图片到 Bitmap,这在对加载优化大图片时非常有用。

只加载图片尺寸可以参考以下代码:

Kotlin 复制代码
val options = BitmapFactory.Options()  
options.inJustDecodeBounds = true  
BitmapFactory.decodeFile("./test.png", options)  
val with = options.outWidth  
val height = options.outHeight

inDensity、inTargetDensity 与 inScaled

只有当 inScaled 设置为 true 时(默认就是为 true),inDesityinTargetDesity 才会生效。
inDesity 表示输入的图片的像素密度,inTargetDesity 表示渲染时的像素密度,当他们的值不一样时,就需要重新计算输入图片的放缩值,计算方式放缩的方式是 scale = inTargetDesity / inDesity

这里就不得不再提到不同 dpi 目录下的 drawable 的资源文件,当 dpi 越高的目录下的资源文件的 inDesity 值就越大。可以参照以下的表:

一模一样的图片存放在不同 dpidrawable 目录下,当在程序运行时加载他们获取到的 Bitmap 是不一样的。

我这里测试了 ldpixxxhdpi 的情况。最后得到的测试截图是:

上面的图片是 ldpi,而下面的图片是 xxxhdpi。根据上面的表得知 ldpiinDesity0.75,而 xxxhdpiinDesity3.5,代入上面的公式就得出 ldpi 的放缩值要比 xxxhdpi 要大。其中 inTargetDesity 是根据 屏幕像素密度inScreenDensity 计算的,同一台设备是固定的。

对于上面的测试结果我的理解是:Android 认为 ldpi 中的资源文件本来的像素密度就低,但是屏幕的像素密度比较大,所以就有必要将 ldpi 中的资源文件进行放大,这样才能使高屏幕密度的设备有更好的体验;相反如果是 xxxhdpi 目录下就认为是其中的资源文件像素密度高,和屏幕的像素密度对比相差就比较小,所以放缩小一点就能够有较好的体验,而且更加节省内存。

如果是不同的设备,他们的屏幕的像素密度也不一样,代入上面的公式也就是,同一个目录下的资源文件,高屏幕密度的设备加载的资源占用的内存就更大,分辨率就更高(但是不同的设备使用的资源目录可能不一样,取决于系统的判断,所以为了更好的体验,我们应用的资源文件尽可能的覆盖多的屏幕像素密度设备)。

当然这是系统加载资源文件时 inDensityinTargetDensity 的处理逻辑,我们在加载本地的图片时,我们可以自己来控制 inDensityinTargetDensity 这两个参数以达到放缩图片的目的。

inSampleSize

更加直接的图片加载时的放缩配置,它的值必须是 2 的幂,1 表示不放缩,2 就表示长宽变成原来的 1 / 2,内存的占用就变成原来的 1 / 4

相关推荐
市场部需要一个软件开发岗位10 分钟前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1232 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs3 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob3 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔3 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9963 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly5 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首5 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19438 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
Jinkxs8 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin