Android大图片加载方法

图片在计算机中表示的几种常用格式:

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)

如果我们将一个图片直接加入内存进行显示,那就十分有可能造成内存溢出
因此我们非常有必要关注大图片加载技巧方法:

  1. 不用加载图片到内存,先获取其尺寸,
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}")
  1. 通过图片尺寸计算缩放系数
    获取到图片宽高后,我们即可进行缩放,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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值