Android开发之Bitmap的高效加载

BitmapFactory类提供了四类方法:decodeFile, decodeResource, decodeStream和decodeByteArray

分别用于支持从文件系统,资源,输入流以及字节数组中加载出一个Bitmap对象,前两者又间接调用了decodeStream

为了避免OOM,可以通过采样率有效的加载图片

如果获取采样率?

1.将BitmapFactory.Options的inJustDecodeBounds的参数设置为true并加载图片

2.从BitmapFactory.Options中取出图片的原始宽高,它们对应outWidth和outHeight参数

3.根据采样率的规则并结合目标View的所需大小计算采样率inSampleSize

4.将BitmapFactory.Options的inJustDecodeBounds的参数设置为false,并重新加载图片

上述步骤通过代码体现:

public static Bitmap decodeSampledBitmapFromResource(Resource res, int resId, int reqWidth, int reqHeight){
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight){
    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;

        while((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth){
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}
时间: 2024-08-02 11:01:35

Android开发之Bitmap的高效加载的相关文章

【转】Android开发之Bitmap的内存优化详解

本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1.要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系

IOS开发之Bug--View是懒加载导致出误以为是UI加载的bug

虽然分类为bug,但也算的上是一个问题,一个很简单的问题.先来看看问题的重现,就写了简单的Demo验证效果: 问题:点击ViewController跳转到TwoViewController,发现会延迟一下才出现. 这个问题也是在我工作开发中偶然遇到的,一开始不知道是什么原因.后来发现只要将TwoViewController中的: 箭头指向的一行代码注释去掉,或者添加一行关于任何view的任何操作,比如设置title.设置背景颜色.添加一个view等等操作,就可以避免苹果原生上面我遇到的问题. 解

iOS开发之0行代码加载NSBundle中的@2x与@3x图片

本文只针对通过NSBundle对象的方法 pathForResource 获取本地图片资源遇到的图片名无法自动识别@2x与@3x名称的问题进行测试.总结与分享. 加载本地图片资源的方式一般通过以下两种方法: 第1种: UIImage *img = [UIImage imageNamed:@"imageName"]; 第2种: UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForRes

android开发之bitmap使用

bitmap是android中重要的图像处理工具类,通过bitmap可以对图像进行剪切.旋转.缩放等操作,同时还可以指定格式和压缩质量保存图像文件. 一.拿到一个Bitmap对象 查看源码我们知道,Bitmap被final修饰,因此不可以通过new来获得一个bitmap的实例,获得一个Bitmap对象一般都是通过BitmapFactory来获得,主要有以下几方式. 每一个方法都有自己的重载方法,重载方法多出的参数是Options,解释一下这个参数,这个主要是对生成Bitmap对象做一些简单的处理

Android开发之Bitmap.Config.RGB_565

在学习xutils框架的时候,看到sample代码中有一行这样的代码: 1 bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565); Bitmap.Config.RGB_565是什么意思呢? Bitmap.Config是Android.graphics.Bitmap类里的一个内部类,在Bitmap类里createBitmap(int width, int height, Bitmap.Config config)方法里会用到,打开

android开发之Fragment加载到一个Activity中

Fragments 是android3.0以后添加的.主要是为了方便android平板端的开发.方便适应不同大小的屏幕.此代码是为了最简单的Fragment的使用,往一个Activity中添加Fragment,主要涉及的知识点有:1.Fragment类的创建,2.Fragment的添加3.无UI的 Fragment的添加,根据Tag找回Fragment Fragment对应的Xml布局文件, <LinearLayout xmlns:android="http://schemas.andro

Android高效加载大图、多图解决方案,有效避免程序OOM(转)

本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/training/displaying-bitmaps/index.html 高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨

Android 高效加载大图,多图解决方案,有效避免程序OOM

高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多.大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常.我们可以通过下面的代码看出每个应用程序最高可用内存是多少. [java] view plaincopy in

Android 高效加载大图片避免OOM

参考链接:http://blog.csdn.net/coderinchina/article/details/40964205 我们项目中经常会加载图片,有时候如果加载图片过多的话,小则导致程序很卡,重则OOM导致App挂了,今天翻译https://developer.android.com/training/displaying-bitmaps/index.html,学习Google高效加载大图片的方法. 图片有各种形状和大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统