android计算图片的大小,【Android】图片内存占用大小的计算与验证

一张图片的文件可能只有几KB、十几KB或几十KB,但在内存中解码后,所占用的内存空间是多大呢?

本篇文章将提供图片内存占用大小的计算与验证方法。

文章内容:

Android中一张图片(Bitmap)占用的内存由以下三个因素决定:

图片的像素点个数

单位像素占用的字节数

其中图片的像素点个数是图片的宽度与调试的积,所以一张图片占用的内存值为:

图片长度 * 图片宽度 * 单位像素占用的字节数

单位像素所占用的字节数与图片的解码方式有关。

在Android中,查看Bitmap.Config可以查阅所支持的图片解码方式有以下4种。

cfcdf8240115d2375e591d84b7459db4.png

其中:

ALPHA_8只存储透明度信息而无颜色值;

ARGB_8888是指把每个像素点的透明度、R、G、B色值都用一个byte来表示,即需要4字节的空间来存储一个像素点的颜色信息。

RGB_565:仅需要2个字节的空间来存储每个像素点颜色信息,是由于它不存储像素点的透明度,而且使用5比特表示R色值,6比特表示G色值,5比特表示B色值。

由上可以看出,对同一张图片进行解码时,使用RGB_565的解码方式所占用的内容空间仅仅是ARGB_8888方式的50%。

应用内置的的PNG图片,如果不出现粗糙的光栅组,出于节省内存的角度可以考虑使用ARGB_44444,其它仍保留使用ARGB_8888方式;

应用内置的的非PNG图片,如本来就没有透明通道的jpg,使用ARGB_8888是明显浪费的,建议使用RGB_565方式解码;

对于从网络上下载的图片解码,建议使用RGB_565。

Bitmap.getRowBytes()返回Bitmap中每一行像素点所占用的字节数,所以其值与Bitmap.getHeight()的积即为图片解码后所占用的内存空间值。

// MyImageView img = (MyImageView)findViewById(R.id.img);

Drawable drawable = img.getDrawable();

if (drawable instanceof BitmapDrawable) {

BitmapDrawable bitDrawable = (BitmapDrawable) drawable;

Bitmap bit = bitDrawable.getBitmap();

int rowBytes = bit.getRowBytes();

int height = bit.getHeight();

long memSize = rowBytes * height;

Log.d("ANDROID_LAB", "memSize =" + memSize + "B =" + formatFileSize(memSize));

}

// LogCat输出

D/ANDROID_LAB(31933): memSize =1677824B =1.60MB

MAT是指Memory Analyzer Tool,这次使用该工具来验证上部分内容的编码实现是否正确。

首先写了个小Demo,为了使用MAT查找起来方便,用于显示图片的组件是自定义名称的MyImageView,只要继承自ImageView就好了,不需要再改其它的。

验证步骤详细见下图:

d5c63983f97f604d8f8bfd10789f8c12.png

c07bed1db7c23cd09643c6247dd1fe05.png

daca338d52efae7cc291530f0e398d3a.png

d8582b2ccd5bc68c55f32e1e6e98d208.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值