Android大图片加载方法
程序员文章站
2022-03-23 22:48:55
图片在计算机中表示的几种常用格式:bmp:位图格式,使用普遍。其结构简单,未经过压缩,高质量,图像文件较大,但能被大多数软件采用。jpg:广泛引用,压缩率高,有损压缩,占用磁盘空间较少。GIF:分为静态GIF和动画GIF两种png:与JPG格式类似,压缩比高于GIF,高质量保存,支持图像透明图片占用内存大小计算公式:总像素单个像素大小如bmp位图可以按每个像素能表示多少种颜色进行划分:单色位图:每个像素可表示两种颜色,即非黑即白,一个像素占1/8个字节16色位图:一个像素占1/2个字节2...
图片在计算机中表示的几种常用格式:
bmp:位图格式,使用普遍。其结构简单,未经过压缩,高质量,图像文件较大,但能被大多数软件采用。
jpg:广泛引用,压缩率高,有损压缩,占用磁盘空间较少。
GIF:分为静态GIF和动画GIF两种
png:与JPG格式类似,压缩比高于GIF,高质量保存,支持图像透明
图片占用内存大小计算公式:总像素*单个像素大小
- 如bmp位图
可以按每个像素能表示多少种颜色进行划分:
单色位图:每个像素可表示两种颜色,即非黑即白,一个像素占1/8个字节
16色位图:一个像素占1/2个字节
256色位图:一个像素占1个字节
24位图:rgb格式,一个通道占一个字节,一个像素占3个字节
android中保存图片通常采用png格式,一个像素拥有ARGB四个通道(ARGB_8888),因此一个像素占4个字节,保存到磁盘时是经过压缩的,但加载进入内存时是解压过的,因此内存占用大小也应按公式计算
- 例如:现在有个1M的png图片尺寸是35002500,加载到内存是内存大小计算:35002500*4/1024/1024=31M,
对于一些android机对每个应用大小内存限制小的那直接报OOM错误了
获取单个app内存限制方法:
val activityManager = this.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
println("内存限制"+activityManager.largeMemoryClass)
获取当前app使用内存:
println("app使用内存"+activityManager.memoryClass)
如果我们将一个图片直接加入内存进行显示,那就十分有可能造成内存溢出
因此我们非常有必要关注大图片加载技巧方法:
- 不用加载图片到内存,先获取其尺寸,
val options = BitmapFactory.Options()
//inJustDecodeBounds=true代表仅仅获取图片信息而不直接加载进入内存
options.inJustDecodeBounds = true
BitmapFactory.decodeResource(resources, R.drawable.ic_launcher, options)
val outWidth = options.outWidth
val outHeight = options.outHeight
println("宽-高:${outWidth}-${outHeight}")
- 通过图片尺寸计算缩放系数
获取到图片宽高后,我们即可进行缩放,options中的inSampleSize参数就是用来设置缩放大小的,一旦缩放加载,那图片所占用的内存也相应变小,但到底需要缩放多少并不是说固定的,一张图片加载到imageView控件上时,大图肯定缩放比率肯定要大,小图就相对小点。
这里我们将图片加载到一个ImageView上:
<ImageView
android:id="@+id/iv"
android:layout_height="200dp"
android:layout_width="200dp"
/>
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
//获取图片宽高
BitmapFactory.decodeResource(resources, R.drawable.test, options)
val outWidth = options.outWidth
val outHeight = options.outHeight
//获取控件宽高
val iv = findViewById<ImageView>(R.id.iv)
val ivWidth = iv.maxWidth
val ivHeight = iv.maxHeight
//计算缩放率,所放比率小于1那就是放大,没必要缩放了
//缩放按宽高中缩放最大那个进行缩放,否则有可能容不下
var sampleSize = 1
val scaleW = outWidth/ivWidth
val scaleH = outHeight/ivHeight
if (scaleW>scaleH && scaleW>sampleSize){
sampleSize = scaleW
}
if (scaleW<scaleH && scaleH>sampleSize){
sampleSize = scaleH
}
//重新设为false表示正真加载图片
options.inJustDecodeBounds = false
options.inSampleSize = sampleSize
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test, options)
iv.setImageBitmap(bitmap)
注:
获取手机屏幕可显示区域宽高像素:
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val defaultDisplay = wm.defaultDisplay
val point = Point();
defaultDisplay.getSize(point)
val windowWidth = point.x
val windowHeight = point.y
本文地址:https://blog.csdn.net/weixin_43860530/article/details/110223796