前言:原本我是作电视应用的,可是由于公司要出手机,人员紧张,因此就抽调我去支援一下,谁叫俺是雷锋呢!我作的一个功能就是处理手机中的应用ICON,处理无非就是美化一下,从新与底板进行合成和裁剪,用到了不少Bitmap的知识。原本以前一直想写一些关于Bitmap的博客,正好这是个机会,所以Bitmap那些事系列博客诞生了。这个系列我会把学习Bitmap的一些知识发布出来供你们参考和交流。 android
在手机中图片通常都是指Bitmap图片,为何要说Bitmap呢?由于你们在开发应用的时候,都会使用一些图片来表现UI,用户也喜欢看图片,看文字获取信息太慢而且不直观,若是美工设计的好,看图片基本上不怎么看你的文字内容就知道你要表达什么,例如全部的购物网站都会编辑不少商品的配图来呈现给用户,因而可知图片在应用程序中的常见和重要。只要说到图片就不能离开如何避免OOM这个主题,由于在处理不少图片时很容易出现OOM,那么学习图片处理就显得尤其重要了,下面就让咱们一步一步学习图片的相关知识。 app
Bitmap图片占用内存计算: 学习
Bitmap图片在加载到内存的时候是按照:宽*高*像素点位数来计算的。你能够把图片当作是由width行、height列的矩阵组成,每个矩阵元素表明一个像素点,每个像素点都是1byte整数倍的数据,这个数据越大,表示的色彩就越丰富,图片的显示质量就越高。Bitmap中有一个枚举类Config用来配置图片的压缩格式,表明每一个像素是用多大的数据来存储的,数值越大可以存储的颜色信息就越多,也就越丰富,显示效果也就越好。Config.ALPHA_8是1 byte,Config.RGB_565和Config.ARGB_4444都是2 bytes,Config.RGB_565没有Alpha值因此多用来配置没有透明度的图片,Config.ARGB_8888是4 bytes,通常图片都是按照这个来配置的。下面是获取配置的代码: 网站
1
2
3
4
5
6
7
8
9
10
11
12
|
static int getBytesPerPixel(Config config) {
if (config == Config.ARGB_8888) {
return 4;
} else if (config == Config.RGB_565) {
return 2;
} else if (config == Config.ARGB_4444) {
return 2;
} else if (config == Config.ALPHA_8) {
return 1;
}
return 1;
}
|
使用图片你须要注意哪些: google
一、android系统自身的问题。android系统给每个应用分配了必定的内存空间,分配了多少要看厂家和机型,数值能够经过Runtime类获取,Runtime.getRuntime()获取实例,而后经过maxMemory()方法获取系统可为APP分配的最大内存,totalMemory() 获取APP当前所分配的内存heap空间大小,freeMemory()获取当前可用的内存,当被耗尽时会自动扩张,可是不会超过maxMemory。下图为google官网提供的不一样分辨率下不一样的dpi分配的最小内存; spa
二、须要多大的照片。不少图片其实在手机上显示的时候不须要彻底把原图加载到内存中,好比我手机相机拍了一张照片是4208*3120的,加载到内存中占用的内存就是52M,这是很恐怖的,两张照片差很少就把你的app内存给耗光了。通常状况下你都须要对须要加载的图片进行处理,这个处理主要是减少图片尺寸,下降分辨率,好比你的控件显示就是100*100的大小,那你就要把图片缩小到100*100。 .net
三、及时释放内存。安卓2.3.3(API级别10)以前,Bitmap像素数据和Bitmap对象是分开存储的,像素数据是存储在native memory中,对象存储在Dalvik heap中,native memory中的像素数据不是以一种可预见的方式释放,可能致使应用程序暂时超过其内存限制和崩溃,因此在Android2.3.3(API 10)以前你必需要调用recycle()方法来释放掉内存避免出现OOM,固然前提是肯定这个bitmap再也不使用,不然会出现 "Canvas: trying to use a recycled bitmap". 在Android3.0(API 11)以后,Bitmap的像素数据和Bitmap对象一块儿存储在Dalvik heap中,因此咱们不用手动调用recycle()来释放Bitmap对象,内存的释放都交给垃圾回收器来作。 设计
以上是学习Bitmap的一些基础知识和加载到手机内存中须要注意的事项,下一篇博客我会写如何更好的加载Bitmap,怎样省内存,怎样高效。谢谢你们的浏览,写的很差的地方和有任何疑问请留言或者更快的与我交流请添加:coder_online公众号,这里不只有个人文章,还有个人小伙伴们的,各类技术分享,不妨你来看看,咱们期待你的到来。也能够扫描下面的二维码,duang的一下就找到咱们了。。。。。。。 code