您当前的位置: 首页 >  android

Kevin-Dev

暂无认证

  • 0浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android -- 技术周刊】第 016 期

Kevin-Dev 发布时间:2022-05-18 09:27:57 ,浏览量:0

在这里插入图片描述

Bitmap 的创建

创建 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 实例化之后的内存使用情况)。

Bitmap 的使用

我们已经知道了 BitmapFactory 是如何通过各种资源创建Bitmap了,那么我们如何合理的使用它呢?以下是几个我们使用Bitmap需要关注的点:

  1. 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

关注
打赏
1658837700
查看更多评论
立即登录/注册

微信扫码登录

0.0436s