很好的关于Bitmap内存讨论的文章

android bitmap内存那些事 bitmap内存占用是一个困扰我很久的问题,今天就好好理一理! 这篇文章用的图片为下面这张图:480 * 800 (这里放上来的我把它缩小了,要不然网页上显示着特别大) 问题:一张压缩前 和 压缩后的图片,PC上的大小有区别,但尺寸不变,只是质量压缩了,那么读入内存时占用的内存大小呢? 验证: 机型:小米2s 压缩前的图大小如下: 压缩后的图大小如下: 阅读详情

1、将图片转化为缩略图再加载: 

[java]  view plain copy print ?
  1. BitmapFactory.Options options = new BitmapFactory.Options();  
  2.   
  3. options.inSampleSize = 2;  
  4.   
  5. Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options);  


该段代码便是读取1.png的缩略图,长度、宽度都只有原图片的1/2。图片大小削减,占用的内存天然也变小了。这么做的弊病是图片质量变差,inSampleSize的值越大,图片的质量就越差。因为各手机厂商缩放图片的算法不合,在不合手机上的缩放图片质量可能会不合。笔者就遭受过moto手机上图片缩放后质量可以接管,三星手机上同样的缩放比例,质量却差很多的景象。

 

 

2、用ARBG_4444色彩模式加载图片:

Android中有四种,分别是:

ALPHA_8:每个像素占用1byte内存

ARGB_4444:每个像素占用2byte内存

ARGB_8888:每个像素占用4byte内存

RGB_565:每个像素占用2byte内存

Android默认的色彩模式为ARGB_8888,这个色彩模式色彩最细腻,显示质量最高。但同样的,占用的内存也最大。

[java]  view plain copy print ?
  1. BitmapFactory.Options options = new BitmapFactory.Options();  
  2.   
  3. options.inPreferredConfig = Bitmap.Config.ARGB_4444;      
  4.   
  5. Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options);  


以上代码便是将1.png以ARGB_4444模式读出。内存削减固然不如第一种办法明显,然则对于大多半图片,看不出与ARGB_8888模式有什么差别。不过在读取有渐变结果的图片时,可能有色彩条呈现。别的,会影响图片的殊效处理惩罚。

 

 

3、调用图片的recycle()办法:

这个其实不是真正降落图片内存的办法。首要目标是标识表记标帜图片对象,便利收受接管图片对象的本地数据。图片对象的本地数据占用的内存最大,并且与法度Java项目组的内存是分隔策画的。所以经常呈现Java heap足够应用,而图片产生OutOfMemoryError的景象。在图片不应用时调用该办法,可以有效降落图片本地数据的峰值,从而削减OutOfMemoryError的概率。不过调用了recycle()的图片对象处于“放弃”状况,调用时会造成法度错误。所以在无法包管该图片对象绝对不会被再次调用的景象下,不建议应用该办法。希罕要重视已经用setImageBitmap(Bitmap img)办法分派给控件的图片对象,可能会被体系类库调用,造成法度错误。

 

 

4、应用Matrix对象放大的图片如何更改色彩模式:

固然应用Matrix对象放大图片,必然会花费更多的内存,但有时辰也不得不如许做。放大后的图片应用的ARGB_8888色彩模式,就算原图片是ARGB_4444色彩模式也一样,并且没有办法在放大时直接指定色彩模式。可以采取以下办法更改图片色彩模式。

[java]  view plain copy print ?
  1. Matrix matrix = new Matrix();  
  2.   
  3. float newWidth = 200;//图片放大后的宽度   
  4.   
  5. float newHeight = 300;//图片放大后的长度   
  6.   
  7. matrix.postScale(newWidth / img.getWidth(), newHeight/ img.getHeight());  
  8.   
  9. Bitmap img1 = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);//获得放大的图片   
  10.   
  11. img2 = img1.copy(Bitmap.Config.ARGB_4444, false);//获得ARGB_4444色彩模式的图片   
  12.   
  13. img = null;  
  14.   
  15. img1 = null;  


这里比起本来的图片额外生成了一个图片对象img1。然则体系会主动收受接管img1,所以实际内存还是削减了。

 

归结起来还是以缩略图模式读取图片和削减图片中每个像素占用的内存。这两种办法固然有效,然则也有各自的弊病。实际开辟中还是应当按照景象酌情应用。最王道的办法,还是避免垃圾对象的产生。例如在ListView的应用中,复用convertView等。若是应用AsyncTask加载图片,要及时将引用的ImageView对象置为null。因为AsyncTask是用线程池实现的,所以此中引用的对象可能会拥有很长的生命周期,造成GC无法开释。我还是信赖Android的内存收受接管机制的,recycle什么的固然必然程度上有效,但总感觉不合适Java内存收受接管的原则。(最后这句美满是着魔了)

 
 
 

补充...

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存.


因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用 JNI >> nativeDecodeAsset() 来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间.


如果在读取时加上图片的Config参数,可以更有效减少加载的内存,从而有效阻止抛出out of Memory异常另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应,使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了.


BitmapFactory.Options.inPreferredConfig
ALPHA_8:数字为8,图形参数应该由一个字节来表示,应该是一种8位的位图
ARGB_4444:4+4+4+4=16,图形的参数应该由两个字节来表示,应该是一种16位的位图.
ARGB_8888:8+8+8+8=32,图形的参数应该由四个字节来表示,应该是一种32位的位图.
RGB_565:5+6+5=16,图形的参数应该由两个字节来表示,应该是一种16位的位图.
ALPHA_8,ARGB_4444,ARGB_8888都是透明的位图,也就是所字母A代表透明.
ARGB_4444:意味着有四个参数,即A,R,G,B,每一个参数由4bit表示.
ARGB_8888:意味着有四个参数,即A,R,G,B,每一个参数由8bit来表示.
RGB_565:意味着有三个参数,R,G,B,三个参数分别占5bit,6bit,5bit.


BitmapFactory.Options.inPurgeable;
如果 inPurgeable 设为True的话表示使用BitmapFactory创建的Bitmap用于存储Pixel的内存空间在系统内存不足时可以被回收,在应用需要再次访问Bitmap的Pixel时(如绘制Bitmap或是调用getPixel),系统会再次调用BitmapFactory decoder重新生成Bitmap的Pixel数组.为了能够重新解码图像,bitmap要能够访问存储Bitmap的原始数据.在inPurgeable为false时表示创建的Bitmap的Pixel内存空间不能被回收,这样BitmapFactory在不停decodeByteArray创建新的Bitmap对象,不同设备的内存不同,因此能够同时创建的Bitmap个数可能有所不同,200个bitmap足以使大部分的设备重新OutOfMemory错误.当isPurgable设为true时,系统中内存不足时,可以回收部分Bitmap占据的内存空间,这时一般不会出现OutOfMemory 错误.

[Android] Android开发优化之——对Bitmap的内存优化 在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,对于图片的内存优化,是Android应用开发中比较重要的内容。 1) 要及时回收Bitmap的内存Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android系统有 阅读详情

相关推荐

谈谈fresco的bitmap内存分配

bitmap的内存分配主要有两个含义: 应用程序实现时针对bitmap的内存缓存;从原始数据(byte[])经过decode生成bitmap过程中的内存分配问题; 其中第一个含义,在Fresco中实现对应的就是interface MemoryCache,这里略有提及,不会大费章节,主要关注decode过程中的内存分配问题。

chiefhsing的专栏 5867

Android图片内存优化的几点心得

1、将图片转化为缩略图再加载:  BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options); 该段代码便是读取1.png的缩略图,长度、宽度都只

NekoCode 的记事本 1404

Bitmap之内存管理

文章目录前言1.Bitmap简介2.BitmapFactory.Options控制图片解码的参数3.Bitmap的内存占用3.Bitmap的高效加载/内存压缩/采样率压缩4.Bitmap的缓存策略5.Bitmap的内存复用6.小结 前言 在Android应用程序内存问题中,Bitmap内存问题,占了相当的比重,所以弄清楚Bitmap内存管理的机制原理就尤为重要。下面就分析总结一下,Bitmap内存...

天亮了的博客 1379

Android Gilde获取网络图片显示保存路径并转化为bitmap

为某个按钮或者图片添加点击事件,然后:strImg为图片url地址 ,loadDialog只是个提示信息,可以不要这个参数。loadDialog.initShow(context,"图片保存中");详细注释,放在代码里面了。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 2059

Bitmap详解

RGB色彩模式是工业界的一种颜色标准,是通过对红、绿、蓝三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。

wang_yong_hui_1234的博客 2772

WPF中Image控件Source属性的相对路径和绝对路径问题(经验总结)

WPF中Image控件Source属性的相对路径和绝对路径问题的开发经验总结,亲测通过!

Android 将图片网址url转化为bitmap,drawable转bitmap,file转bitmap,bitmap转file,Bitmap转String,Uri转Bitmap

file转bitmap File param = new File(); Bitmap bitmap= BitmapFactory.decodeFile(param.getPath()); drawable转bitmap Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.mipmap.jcss_03 ...

meixi_android的博客 3万+

RocketMQ源码分析之消息轨迹

文章目录前言一、消息轨迹二、消息轨迹源码分析1、producer端2、consumer端三、消息轨迹中存储的信息1.TraceContext2.TraceBean3.TraceType四、总结 前言   本篇文章将会从以下方面介绍消息轨迹:什么是消息轨迹?如何启用消息轨迹?示例demo、消息轨迹的源码分析和消息轨迹中存储的信息。最后会用一张图来总结消息轨迹的工作原理。 一、消息轨迹 1.什么是消息轨迹? 消息轨迹是用来跟踪记录消息发送、消息消费的轨迹。 2.如何启用消息轨迹? broker端 需要在b

不爱学习的小妞博客 1076

常用方法(1)------根据图片的url路径获得Bitmap对象

1、 本地url转换为Bitmap /** * @param uri:图片的本地url地址 * @return Bitmap; */ private Bitmap decodeUriAsBitmap(Uri uri) { Bitmap bitmap = null; try { bitmap = Bitma

Sean_css的博客 1万+

Kettle下载与安装教程【保姆版】

Kettle简介 Kettle最早是一个开源的ETL工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。 它由Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。 主要功能 Pentaho D

weixin_43407520的博客 12万+

避坑指南:SAP成本中心分割结构配置常见错误及解决(含KA06/KL01前置步骤)

本文深入解析了SAP成本中心会计中分割结构配置的关键步骤与常见错误。重点强调了配置前必须通过KA06创建次级成本要素(类别42)和通过KL01创建活动类型这两个核心前置步骤,并详细剖析了在OKES中定义分割规则及版本时的高频报错原因与解决方案,帮助顾问和运维人员有效规避配置陷阱,确保成本分摊的准确性。

pear55的博客 865

图片文件和Bitmap之间的转换

图片文件转为Bitmap对象String filePath="c:/01.jpg";Bitmap bitmap=BitmapFactory.decodeFile(filePath);如果图片过大,可能导致Bitmap对象装不下图片 解决String filePath="c:/01.jpg"; Bitmap bitmap=BitmapFactory.decodeFile(filePath,getBi

libeyond_的专栏 2382

【Zotero】《纯操作讲解,GPT配置,Zotero标注可视化》- 知识点目录

Temperature分布在。之间,越低输出越稳定;

墨门 3395

慎用BitMap, 小心玩爆你的内存

最初,没有人在意这场灾难,这不过是一场山火,一次旱灾,一个物种的灭绝,一座城市的消失。直到这场灾难和每个人息息相关 ——《流浪地球》

时间静止 2656

使用NXP SBC插件开发FS26软件

FS26作为功能安全可达ASIL D的SBC,在配合NXP MCU的使用中非常广泛,本文介绍基于NXP官网的SBC代码包快速进行FS26软件的开发FS26使用过程中还有不少坑的地方,后面有空可以再介绍相关的功能。

赞的博客 649

【产品】 产品设计:如何解决铝合金氧化着色后表面硬度低的问题(硬质氧化)

1、氧化处理技术 1)化学氧化 化学氧化处理所获得的膜层较薄,一般厚度为0.5μm ~4μm,质软不耐磨,抗蚀能力低于阳极氧化膜。 一般不宜单独便用,由于化学氧化膜吸附能力好,主要作用于油漆的底层,化学氧化按其溶液性可分为碱性和酸性两种。按其膜层性质可分为氧化膜,磷酸盐膜、铬酸盐膜及磷酸一铬酸盐膜等(这类型的氧化膜是可导电)。 2)电化学氧化(阳极氧化) 电化学氧化(俗称阳极氧化)是铝及...

产品线负责人 9727

Android中Bitmap内存优化

ARGB_4444 (4) | 4 | 已废弃 || ARGB_8888 (5) | 4 | 24位真彩色 || RGBA_F16 (6) | 8 | Android 8.0 新增(更丰富的色彩表现HDR) || HARDWARE (7) | Special | Android 8.0 新增 (Bitmap直接存储在graphic memory)**注1:**关于Android 8.0中新增的这个配置,已经有相关问题,可以关注下。

2501_90252650的博客 1106

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

Bitmap的使用习惯——及时释放Bitmap占用的内存

及时释放Bitmap占用的内存,避免OOM

自由人 2万+

2025资源从哪里来!

研究网络通信中的安全问题,如VLAN划分、路由协议(静态、动态如OSPF、BGP)、NAT转换、AAA认证、访问控制列表(ACL)等。‌Wi-Fi安全设置‌、‌密码破解原理‌(仅用于合法测试或教育目的)、‌常见Web安全问题‌如SQL注入、XSS跨站脚本攻击等的防范措施。在这个网站你可以找到你对应的专业-对应的路线-对应的资源-对应的百度网盘里面全是免费的资源------------------惊喜不?‌防火墙配置与策略‌、‌入侵检测与防御系统(IDS/IPS)‌、‌端口扫描与漏洞扫描技术‌等。

qq_56248592的博客 1902

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Android 内存优化】Bitmap 内存占用计算 ( Bitmap 图片内存占用分析 | Bitmap 内存占用计算 | Bitmap 不同像素密度间的转换 )

一、Bitmap 内存占用、 二、Bitmap 内存占用计算示例、 三、Bitmap 内存占用与像素密度、 四、Bitmap 内存占用与像素密度示例、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2325

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

面试:Android Bitmap 内存存储在JVM还是在native

Android Bitmap 内存存储所在之争(Java(Dalvik) Heap And Native Heap) 在Android 3.0(API level 11) ~ Android 7.1(API level 25)中无论是Bitmap对象还是像素点数据(Pixel Data),都统一存储在Dalvik Heap。 然而从Android 8.0(API level 26) 开始,截至到2018年3月的版本,素点数据(Pixel Data)被存储到Native Heap。 Bitmap的一些问.

王温暖的博客 2708

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

你的APP内存还在暴增吗?试着用Bitmap管理下内存~

相信伙伴们在日常的开发中,一定对图片加载有所涉猎,而且对于图片加载现有的第三方库也很多,例如Glide、coil等,使用这些三方库我们好像就没有啥担忧的,他们内部的内存管理和缓存策略做的很好,但是一旦在某些场景中无法使用图片加载库,或者项目中没有使用图片加载库而且重构难度大的情况下,对于Bitmap内存的管理就显得尤为重要了,一旦使用出现问题,那么OOM是常有的事。

1 832

Redis的bitmap使用不当,我内存爆了

目前的全球因特网所采用的协议族是TCP/IP协议族。IP是TCP/IP协议族中网络层的协议,是TCP/IP协议族的核心协议。IP协议定义了一种地址编码,称为IP地址,它是网络中网络段、网络设备接口、主机的编码,它并不是一种物理地址,而是逻辑地址,即地址是可以被分配、并且非固定、可修改的。IPv4,是互联网协议(Internet Protocol,IP)的第四版,也是第一个被广泛使用,构成现今互联网技术的基石的协议。

qq_33228984的博客 2269

android bitmap内存,Android Bitmap 到底占了多少内存

前言在Android的内存优化中,对Bitmap的优化绝对是主角,因为Bitmap对内存的影响很大,稍有不慎就很容易引起OOM的问题。不信的话就随我来看看Bitmap到底能吃掉多少内存。预备知识本篇文章不会讲到任何源码的东西,但还是需要有一定的预备知识的。Bitmap的色彩模式,目前常见的有两种模式:Config.RGB_565:565分别对应着表示RGB所需要的位数,加起来是16位,也就是一个像...

weixin_39610721的博客 317

【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

一、Bitmap 复用池、 二、弱引用 Bitmap 内存释放、 三、从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象、 1、Android 2.3.3(API 级别 10)及以下的版本、 2、Android 4.4(API 级别 19)以下的版本、 2、在 Android 4.4(API 级别 19)及以上的版本、 四、LruCache 内存缓存、内存复用工具类、 1、工具类、 2、工具类测试、 3、执行结果、 五、源码及资源下载

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3548
上一篇: android scrollview 动态滚动
下一篇: dp和px,那些不得不吐槽的故事——Android平台图片文字元素单位浅析
恶魔果实
博客等级 码龄15年 6粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值