Drawable和 Bitmap 的区别:
对比项 Bitmap Drawable
显示清晰度 相同 相同
占用内存 大 小
支持缩放 是 是
支持色相色差调整 是 否
支持旋转 是 是
支持透明色 是 是
绘制速度 慢 快
支持像素操作 是 否
引用
http://blog.sina.com.cn/s/blog_5fc933730101ay5x.html
首先 对于第一段代码 调用getResources().getDrawable()获得1000个Drawable()对象 我相信评论中说的是正确的 :
Drawable[] array 中的所有Drawable都指向同一个R.drawable.img的Drawable对象
第三段代码换用BitmapFactory.decodeStream()创建Bitmap对象 在创建第566个Bitmap的时候OOM
文末说用Drawable.createFromStream()创建Drawable 也是在创建第566个Drawable的时候OOM
这正说明了Shelly所说的,Drawable与Bitmap在此种情况下内存占用是完全一致的
根据OOM时的LOG :
04-07 22:16:12.916: E/filemap(8091): mmap(0,416798) failed: Out of memory
在此状态下 平均每个Drawable或Bitmap所占的内存约小于736K (416798/566)
第二段代码 调用BitmapFactory.decodeResource()来创建Bitmap对象 创建了8个Bitmap后即OOM
根据LOG :
04-07 22:06:05.774: D/dalvikvm(7937): GC_EXTERNAL_ALLOC freed 1K, 50% free 2691K/5379K, external 6026K/7525K, paused 31ms
每次加载完毕后 GC的报告中 external都增加 6026K :6026K/7525K ->12052K/14100K -> 18078K/20126K -> 24104K/26152K -> 30130K/32178K -> 36156K/38204K
因此可认为在此状态下 平均每个Bitmap所占的内存应该是6026K
其内存占用是第三段代码结果的8.2倍(6026K/736K)
其与第三段代码的区别仅在于调用的方法不同: decodeResource() 和 decodeStream()
有关此二者的关系 sevensundark在 http://blog.csdn.net/sevensundark/article/details/7616450 此帖中阐述了
于是翻看源码,得到执行两种方法时的调用次序:
decodeFile(String pathName) ->decodeFile(pathName, null) -> decodeStream(stream, null, opts)
decodeResource(res, id) -> decodeResource(res, id, null) -> decodeResourceStream(res, value, is, null, opts) -> decodeStream(is, pad, opts)
在opts参数中是含有密度信息的
我们都知道在调用res中指定密度的文件夹下的图片时会根据源图片所在的文件夹和当前设备的密度进行缩放
两个Bitmap的内存占用相差8倍 很有可能是他们的缩放系数刚好相差3倍 这样两个Bitmap的像素数量就相差了9倍 体积也就差了9倍
所以我们完全有理由相信在新浪博主OiSoft在调用decodeStream(is)方法的时候 Android系统采用的缺省密度是160或更低(应该为120)
而decodeResource(res, id)中调用的decodeStream(is, pad, opts)中 参数opts所含的屏幕密度是当前设备的密度 而此密度应该会不小于240(应该为300以上了)
于是Android在调用decodeResource方法建立bitmap的时候就将图片放大了 其效率也随之降低了
首先 对于第一段代码 调用getResources().getDrawable()获得1000个Drawable()对象 我相信评论中说的是正确的 :
Drawable[] array 中的所有Drawable都指向同一个R.drawable.img的Drawable对象
第三段代码换用BitmapFactory.decodeStream()创建Bitmap对象 在创建第566个Bitmap的时候OOM
文末说用Drawable.createFromStream()创建Drawable 也是在创建第566个Drawable的时候OOM
这正说明了Shelly所说的,Drawable与Bitmap在此种情况下内存占用是完全一致的
根据OOM时的LOG :
04-07 22:16:12.916: E/filemap(8091): mmap(0,416798) failed: Out of memory
在此状态下 平均每个Drawable或Bitmap所占的内存约小于736K (416798/566)
第二段代码 调用BitmapFactory.decodeResource()来创建Bitmap对象 创建了8个Bitmap后即OOM
根据LOG :
04-07 22:06:05.774: D/dalvikvm(7937): GC_EXTERNAL_ALLOC freed 1K, 50% free 2691K/5379K, external 6026K/7525K, paused 31ms
每次加载完毕后 GC的报告中 external都增加 6026K :6026K/7525K ->12052K/14100K -> 18078K/20126K -> 24104K/26152K -> 30130K/32178K -> 36156K/38204K
因此可认为在此状态下 平均每个Bitmap所占的内存应该是6026K
其内存占用是第三段代码结果的8.2倍(6026K/736K)
其与第三段代码的区别仅在于调用的方法不同: decodeResource() 和 decodeStream()
有关此二者的关系 sevensundark在 http://blog.csdn.net/sevensundark/article/details/7616450 此帖中阐述了
于是翻看源码,得到执行两种方法时的调用次序:
decodeFile(String pathName) ->decodeFile(pathName, null) -> decodeStream(stream, null, opts)
decodeResource(res, id) -> decodeResource(res, id, null) -> decodeResourceStream(res, value, is, null, opts) -> decodeStream(is, pad, opts)
在opts参数中是含有密度信息的
我们都知道在调用res中指定密度的文件夹下的图片时会根据源图片所在的文件夹和当前设备的密度进行缩放
两个Bitmap的内存占用相差8倍 很有可能是他们的缩放系数刚好相差3倍 这样两个Bitmap的像素数量就相差了9倍 体积也就差了9倍
所以我们完全有理由相信在新浪博主OiSoft在调用decodeStream(is)方法的时候 Android系统采用的缺省密度是160或更低(应该为120)
而decodeResource(res, id)中调用的decodeStream(is, pad, opts)中 参数opts所含的屏幕密度是当前设备的密度 而此密度应该会不小于240(应该为300以上了)
于是Android在调用decodeResource方法建立bitmap的时候就将图片放大了 其效率也随之降低了
相关推荐
android 画图 bitmap drawable canvas paint
Android Drawable和Bitmap的转换实例详解 通常我们需要通过代码去设置图片,就需要设置图片Bitmap和Drawable的转换,下面整理了几种方式 一、Bitmap转Drawable Bitmap bm=xxx; //xxx根据你的情况获取 ...
文档中描述了Drawable Bitmap 几种转换方法供初学者使用。方法都是经过实践验证的。
public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat....
Drawable Bitmap之间的转化Drawable Bitmap之间的转化
Drawable Bitmap InputStream byte[]相互转化工具类,单例模式
很多开发者表示,不知道Android的Drawable和Bitmap之间如何相关转换。下面Android123给大家两种比较简单高效的方法。 一、Bitmap转Drawable 代码如下: Bitmap bm=xxx; //xxx根据你的情况获取 BitmapDrawable bd...
Android Drawable、Bitmap、byte、灰度 转换
主要介绍了Android Bitmap和Drawable的对比的相关资料,需要的朋友可以参考下
Android Drawable、Bitmap、byte、灰度 之间的转换
6.2.1 Bitmap Drawable / 244 6.2.2 Shape Drawable / 247 6.2.3 Layer Drawable / 251 6.2.4 State List Drawable / 253 6.2.5 Level List Drawable / 255 6.2.6 Transition Drawable / 256 6.2.7 ...
/ 228 5.2 Remote Views的内部机制 / 230 5.3 Remote Views的意义 / 239 第6章 Android的Drawable / 243 6.1 Drawable简介 / 243 6.2 Drawable的分类 / 244 6.2.1 Bitmap Drawable / 244 6.2.2 Shape ...
详细的介绍了android_Drawable、Bitmap、byte[]之间的转换 在android开发中非常实用
很多网友刚刚开始学习Android平台,对于Drawable、Bitmap、Canvas和Paint它们之间的概念不是很清楚,其实它们除了Drawable外早在Sun的J2ME中就已经出现了,但是在Android平台中,Bitmap、Canvas相关的都有所变化。...
根据drawable id获取Bitmap 根据drawable id获取Drawable bitmap转drawable 获取资源图片 以最省内存的方式读取本地资源的图片 读取本地drawable中较大的资源图片 从文件得到BitMap 从数组得到Bitmap 从流中得到...
自定义Drawable 实现图片圆角、圆形、椭圆形,帮助理解自定义Drawable; 自定义Drawable 实现图片圆角、圆形、椭圆形,帮助理解自定义Drawable;
Bitmap的使用,加载Drawable、Assert、SDcard上的图片,进行变换、压缩等操作,Bitmap和Drawable相互转换,Bitmap和数组的相互转换。
a color, a shadow size or a text value, this plugin generates for you density specific bitmap drawable resources from qualified SVG files at build time. The only thing you have to do is to provide ...