Android图片加载优化

栏目: Android · 发布时间: 6年前

内容简介:在Android开发中图片加载往往是导致OOM(Out of Memory)的主要原因,所以图片的压缩不得不作为Android开发中比用的一项技能点,以下将以简单的方式进行优化。其实图片大小的计算是很简单的,只需要用图片的width乘以图片的height然后再乘以每一个像素所占用的字节数,这个字节数需要根据图片解码模式来获得,Android中提供了6种方案,不过常用的只有三个,在下方已经列出。A:透明度(Alpha)

Android图片加载优化

在Android开发中图片加载往往是导致OOM(Out of Memory)的主要原因,所以图片的压缩不得不作为Android开发中比用的一项技能点,以下将以简单的方式进行优化。

图片的大小如何被定义?

其实图片大小的计算是很简单的,只需要用图片的width乘以图片的height然后再乘以每一个像素所占用的字节数,这个字节数需要根据图片解码模式来获得,Android中提供了6种方案,不过常用的只有三个,在下方已经列出。

A:透明度(Alpha)

R:红色(Red)

G:绿(Green)

B:蓝(Blue)

Bitmap.Config.ARGB_8888 :由4个8位组成,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位(4字节)

Bitmap.Config.ARGB_4444 :由4个4位组成,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 (2字节)

Bitmap.Config.RGB_565 :没有透明度,R=5,G=6,B=5,,那么一个像素点占5+6+5=16位(2字节)

基础知识补脑:

8bit(位)=1byte(字节)

1024byte=1KB

1024kb=1MB

1024mb=1GB

举例:

1、480x800的图片,在色彩模式为ARGB_8888的情况下

480*800*4/1024/1024=1.46484375MB

2、480x800的图片,在色彩模式为ARGB_4444的情况下

480*800*2/1024/1024=0.732421875MB

通过以上的测试,发现导致过大的原因主要集中在两点上,一点是图片的宽和高零一点则是解码方式,通过等比例缩放图片以及切换解码方式可以有效的降低图片的内存占用。不过在以下的优化方案中还有一种优化就是内存复用技术。

优化方案

缩放图片+质量压缩

var bitmapOptions = BitmapFactory.Options()
bitmapOptions.inJustDecodeBounds = true//设置仅加载图片的宽高信息不将图片加载的内存中
BitmapFactory.decodeResource(resources, R.drawable.testimg, bitmapOptions)//获取图片的宽高
bitmapOptions.inSampleSize = 4//设置缩放比例(1、缩放图片)
bitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565//设置解码模式(2、质量压缩)
bitmapOptions.inJustDecodeBounds = false//消除仅加载图片的宽高
var bitmap = BitmapFactory.decodeResource(resources, R.drawable.testimg, bitmapOptions)//加载图片到内存(注意添加Option对象)
this.imgMain.setImageBitmap(bitmap)//使用Bitmap

inSampleSize的作用就是可以把图片的宽高缩小inSampleSize倍,如下代码设置为4那么就是宽高的四分之一,所占内存缩小inSampleSize的平方。单纯的缩放4倍并不充分,只能说治标不治本,好比一个高清50MB的图片,你缩放4倍还是凉凉,所以说还是根据尺寸来计算需要缩放的倍数。

bitmapOptions.inSampleSize =Math.ceil(bitmapOptions.outWidth.toDouble() / targetWidth.toDouble()).toInt()//设置缩放比例(1、缩放图片)

PS:以上的缩放并非精确的缩放

内存复用

何为内存复用,通俗来说就是我已经创建了一个Bitmap对象了,那么我接着还想用一个bitmap对象,那么就可以复用上一个Bitmap对象,不过这样做有两个缺点,第一就是会将之前的图片覆盖掉,第二就是后边加载的图片必须小于或者等于之前的图片大小,否则就不行。

var bitmapOptions1 = BitmapFactory.Options()
bitmapOptions1.inBitmap = bitmap//绑定一个已经加载的Bitmap对象
var bitmap1 = BitmapFactory.decodeResource(resources, R.drawable.timg, bitmapOptions1)//加载新的Bitmap对象
this.imgMain1.setImageBitmap(bitmap1)//使用Bitmap

其他方案

推荐使用WEBP格式代替PNG和JPEG图片格式。

写在最后

以上所说的只是简单的图片压缩优化,并非特定专业的优化方式,不过应对一般的项目需求应该还是可以满足的。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创新者的窘境(全新修订版)

创新者的窘境(全新修订版)

克莱顿•克里斯坦森 / 胡建桥 / 中信出版社 / 2014-1-1 / 48.00元

全球商业领域中,许多企业曾叱咤风云,但面对市场变化及新技术的挑战,最终惨遭淘汰。究其原因,竟然是因为它们精于管理,信奉客户至上等传统商业观念。这就是所有企业如今都正面临的“创新者的窘境”。 在《创新者的窘境》中,管理大师克里斯坦森指出,一些看似很完美的商业动作——对主流客户所需、赢利能力最强的产品进行精准投资和技术研发——最终却很可能毁掉一家优秀的企业。他分析了计算机、汽车、钢铁等多个行业的......一起来看看 《创新者的窘境(全新修订版)》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具