Android有效的处理Bitmap,减少内存

Android有效的处理Bitmap,减少内存

  图片可能会有不同的大小。在许多情况下,图片的大小会超出我们需要的大小。例如,我们的Camera应用,我们所拍的照片的大小远大于屏幕显示的大小

  假如你的应用被限制了内存使用,显而易见,你会选择加载一个低分辨率的图片。这张低分辨率的图片应该匹配屏幕的尺寸。更高分辨率的图像没有提供任何可见的好处,但仍占用宝贵的内存,而且由于额外的动态缩放,会带来额外的性能开销。

  本篇文章教你通过加载一个小尺寸的图片样本,来修饰一张大图,并且没有超过应用的内存限制。

原文地址http://wear.techbrood.com/training/displaying-bitmaps/load-bitmap.html

获取图片的类型尺寸

  BitmapFactory这个类提供了几种解码方法(例如:decodeByteArray(),decodeFile(),decodeResource());我们在加载图片的额时候,图片可能有很多种来源,我们选择合适的一种方法解码图片。下面提供了方法:为已经创建好的Bitmap重新分配内存,这样就可以很好的解决内存溢出(OutOfMemory Exception) 的问题。每种解码方法都有一些标识位,你可以通过配置BitmapFactory.Options这些标识位来实现。设置inJustDecodeBounds的属性为true的时候,我们解码的时候不分配内存,返回的Bitmap为null,但是我们设置了outWidth,outHeight和outMimeType。这种技术可以预先获取到Bitmap的大小数据和类型数据。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
  为了避免 java.lang.OutOfMemory  exceptions,在解码图片之前,预先检查Bitmap的大小,除非你有绝对的把握你的bitmap有合适的大小,并且在内存限制大小范围之内。

加载缩放的图片到内存

  现在,我们知道了图片的尺寸,我们就可以决定是使用该尺寸的图片,还是使用另外一个样本。线面有一些因素是我们要注意的:
  •   估计加载整个图像所占用的内存
  •  你可以接收的内存使用量和你程序可以使用的内存
  •  你放该图片的ImageView的尺寸或者其他UI组件的尺寸
  •  屏幕的大小
  例如,我们不值得将大小为1024x768 pixel的图片放到128*96 pixel的缩略图控件(ImageVIew)里面。
  我们得使用图片的一个更小的样本加载到内存里面,在BitmapFactory.Options里面设置inSampleSize为true。例如,我们想把一张2048*1536的图片解码为只有1/4大小的图片512*384,加载到内存里卖年只有0.75MB的大小,远远小宇原图12MB的大小(使用ARGB_8888通道的图片)。这里有一种计算样本图片的方法,根据目标图片的宽度和高度width和height:
public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

Note: A power of two value is calculated because the decoder uses a final value by rounding down to the nearest power of two, as per the  inSampleSize documentation.

我们在使用该方法的时候,首先设置 inJustDecodeBounds 为true,然后我们计算inSample的值,然后设置inJustDecodeBounds为false,最后解码图片
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

 这种方法可以帮助我们轻松有效的加载一张100*100的缩略图片:
mImageView.setImageBitmap(
    decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

  你也可以通过相同的方法解码一张从其他路径获取到的图片,通过使用 BitmapFactory.decode*  as need。

 下面还有几篇从android Developer上面翻译过来的,感觉挺有用的,加个关注吧,(*^__^*) 嘻嘻 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值