前言:本来我是做电视应用的,但是因为公司要出手机,人员紧张,所以就抽调我去支援一下,谁叫俺是雷锋呢!我做的一个功能就是处理手机中的应用ICON,处理无非就是美化一下,重新与底板进行合成和裁剪,用到了很多Bitmap的知识。本来之前一直想写一些关于Bitmap的博客,正好这是个机会,因此Bitmap那些事系列博客诞生了。这个系列我会把学习Bitmap的一些知识发布出来供大家参考和交流。

在手机中图片一般都是指Bitmap图片,为什么要说Bitmap呢?因为大家在开发应用的时候,都会使用一些图片来表现UI,用户也喜欢看图片,看文字获取信息太慢并且不直观,如果美工设计的好,看图片基本上不怎么看你的文字内容就知道你要表达什么,例如所有的购物网站都会编辑很多商品的配图来呈现给用户,由此可见图片在应用程序中的常见和重要。只要说到图片就不能离开如何避免OOM这个主题,因为在处理很多图片时很容易出现OOM,那么学习图片处理就显得尤为重要了,下面就让我们一步一步学习图片的相关知识。

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,一般图片都是按照这个来配置的。下面是获取配置的代码:
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;
}
使用图片你需要注意哪些:
1、android系统自身的问题。android系统给每一个应用分配了一定的内存空间,分配了多少要看厂家和机型,数值可以通过Runtime类获取,Runtime.getRuntime()获取实例,然后通过maxMemory()方法获取系统可为APP分配的最大内存,totalMemory() 获取APP当前所分配的内存heap空间大小,freeMemory()获取当前可用的内存,当被耗尽时会自动扩张,但是不会超过maxMemory。下图为google官网提供的不同分辨率下不同的dpi分配的最小内存;
 
 
2、需要多大的照片。很多图片其实在手机上显示的时候不需要完全把原图加载到内存中,比如我手机相机拍了一张照片是4208*3120的,加载到内存中占用的内存就是52M,这是很恐怖的,两张照片差不多就把你的app内存给耗光了。一般情况下你都需要对需要加载的图片进行处理,这个处理主要是减小图片尺寸,降低分辨率,比如你的控件显示就是100*100的大小,那你就要把图片缩小到100*100。
 
3、及时释放内存。安卓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的一下就找到我们了。。。。。。。
 
                                                            

Bitmap那些事之内存占用计算和加载注意事项的更多相关文章

  1. MySQL内存占用计算

    ##MySQL 最大可使用内存( M ): SELECT ( @@key_buffer_size + @@innodb_buffer_pool_size + @@query_cache_size + ...

  2. Android Bitmap那些事之如何优化内存

    前言:”安得广厦千万间,大庇天下寒士俱欢颜“——杜甫.在帝都住的朋友们都可能会遇到租房子困难的问题(土豪请无视),找房子真是力气活,还耗费时间,占用我宝贵的写博客时间,没办法,谁让咱没钱还想住的好点, ...

  3. ANDROID开发之OOM:一张图片(BitMap)占用内存的计算 图片内存优化

    Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数. 一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 注: ...

  4. Android中图片占用内存的计算

    Android中图片占用内存的计算 原文链接 http://blog.sina.com.cn/s/blog_4e60b09d01016133.html   在Android开发中,我现在发现很多人还不 ...

  5. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

  6. Linux下内存占用和CPU占用的计算

    ->使用free命令查看内存使用情况: 1.echo 3 > /proc/sys/vm/drop_caches 2.free 或者使用cat /proc/yourpid/status 来查 ...

  7. Linux下计算进程的CPU占用和内存占用的编程方法[转]

    from:https://www.cnblogs.com/cxjchen/archive/2013/03/30/2990548.html Linux下没有直接可以调用系统函数知道CPU占用和内存占用. ...

  8. (转)aix非计算内存 占用过高 案例一则

    原文:http://www.talkwithtrend.com/Article/28621 两台小型机组成的RAC环境,在用topas查看资源使用情况时,发现一台机器的非计算内存占用过高: MEMOR ...

  9. Redis 实战 —— 12. 降低内存占用

    简介 降低 Redis 的内存占用有助于减少创建快照和加载快照所需的时间.提升载入 AOF 文件和重写 AOF 文件时的效率.缩短从服务器进行同步所需的时间(快照. AOF 文件重写在 持久化选项 中 ...

随机推荐

  1. 【JAVA】学习笔记(2)

    Java完整的类的定义 [pubilc][abstact|final] class className [extends superclassName] [implements InterfaceNa ...

  2. C# ListView应用

    C#  ListView应用 1. 添加表头标题的方法 a. 直接在ListView控件上编写 b. 通过代码编写 //动态添加lstv_ReaderList列表头 /* lstv_ReaderLis ...

  3. 论Activity的转换

    论Activity的互相转换 这次任务是实现 1.在主屏幕输入自己的姓名,单击评估按钮 2.进入第二个界面,并将主屏幕输入的姓名传递给第二个界面 3.在第二个界面进行问题回答: 4.第二个界面的回答结 ...

  4. MySQL中的latch(闩锁)详解——易产生的问题以及原因分析

    Latch 什么是latch: 锁是数据库系统区别与文件系统的一个关键特性.锁机制用于管理对共享资源的并发访问.Innodb存储引擎在行级别上对表数据上锁,这固然不错.但是Innodb也会在多个地方使 ...

  5. 【竞价网站绝技】根据访客ip,页面显示访客所属城市的html代码(借用YY IP地址库)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. ubuntu 安装vue+element

    1.安装npm sudo apt install npm 检测安装npm -v 因为npm安装软件慢,可设置淘宝镜像 npm config set registry https://registry. ...

  7. s3-1 数据链路层概述

    数据链路层功能 为网络层提供服务,良好的服务接口  保证数据传输的有效.可靠: - 处理传输错误:差错检测和控制 流量控制     • 基于速率     • 基于反馈 数据链路层的位置 位于网络层之 ...

  8. 浅析列表页请求优化(history API)

    最近搞了下列表页请求的功能,并做了一下调研整理,记此文备忘. 列表页请求的功能到处可见,比如在博客园. 点击相应的页码,页面返回相应的内容,看上去似乎大同小异,但是一些小的细节还是可以区分优劣. fu ...

  9. opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓

    阅读对象:无要求. 1.代码 ''' OpenCV中的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化 ...

  10. 《python语言程序设计》_第三章(数字函数、字符串和对象)

    3.2_常见的Python函数 (1) abs()函数 求绝对值 (2) max(x1,x2,x3,....)求最大值 (3) min(x1,x2,x3,....)求最小值 (4) pow 返回a的b ...