创建 Bitmap
的时候,Java 不提供 new Bitmap()
的形式去创建,而是通过BitmapFactory
中的静态方法去创建,如:BitmapFactory.decodeStream(is);
通过InputStream
去解析生成Bitmap
,我们跟进BitmapFactory
中创建Bitmap
的源码,最终都可以追溯到这几个native
函数
private static native Bitmap nativeDecodeStream(InputStream is, byte[] storage,
Rect padding, Options opts);
private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd,
Rect padding, Options opts);
private static native Bitmap nativeDecodeAsset(long nativeAsset, Rect padding, Options opts);
private static native Bitmap nativeDecodeByteArray(byte[] data, int offset,
int length, Options opts);
而Bitmap
又是 Java 对象,这个 Java 对象又是从 native,也就是 C/C++ 中产生的,所以,在 Android 中 Bitmap 的内存管理涉及到两部分,一部分是native,另一部分是dalvik,也就是我们常说的 java 堆(如果对java堆与栈不了解的同学可以戳),到这里基本就已经了解了创建 Bitmap 的一些内存中的特性(大家可以使用adb shell dumpsys meminfo
去查看 Bitmap 实例化之后的内存使用情况)。
我们已经知道了 BitmapFactory
是如何通过各种资源创建Bitmap
了,那么我们如何合理的使用它呢?以下是几个我们使用Bitmap
需要关注的点:
- Size
-
这里我们来算一下,在Android中,如果采用
Config.ARGB_8888
的参数去创建一个Bitmap
,这是Google推荐的配置色彩参数,也是Android4.4及以上版本默认创建Bitmap的Config参数(Bitmap.Config.inPreferredConfig
的默认值),那么每一个像素将会占用4byte,如果一张手机照片的尺寸为1280×720,那么我们可以很容易的计算出这张图片占用的内存大小为 1280x720x4 = 3686400(byte) = 3.5M,一张未经处理的照片就已经3.5M了! 显而易见,在开发当中,这是我们最需要关注的问题,否则分分钟OOM! -
那么,我们一般是如何处理Size这个重要的因素的呢?,当然是调整
Bitmap
的大小到适合的程度啦!辛亏在BitmapFactory
中,我们可以很方便的通过BitmapFactory.Options
中的options.inSampleSize
去设置Bitmap
的压缩比,官方给出的说法是 > If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory…For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels. Any value关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?