关于Bitmap的加载(一)

  Android中的Bitmap的加载,为了更好的用户体验,有非常多的奇巧淫技。要达到的目的是,一边加载一边看,不卡屏。图片根据布局大小显示。如果图片大了,要合理的缩小,防止内存溢出。

  于是,我把Android training的讲解记录下来。

  首先,是单一图片的加载。

  单一图片,加载最首要的问题是判断图片的大小。如果图片过大,我们需要对图片进行一定比例的压缩。

  先通过图片本身的宽高和要求的宽高,计算图片的缩放比例。

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;
}

  其中,options中包含了图片本身的宽高信息,会在调用这个函数前获得。

  然后,是对图片加载时参数的设置  

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);
}

  最后,我们即可以调用相应方法,加载图片。

mImageView.setImageBitmap(
    decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

以上,即是将图片压缩到100X100的大小进行加载,图片来源即为R.id.myimage。但是,这样的图片加载,当图片太大时,会引进UI界面的卡顿,下一节将记录如果将这一过程分发至其他线程,保持UI界面的流畅。

时间: 2024-10-25 18:19:02

关于Bitmap的加载(一)的相关文章

Android艺术——Bitmap高效加载和缓存(1)

通过Bitmap我们可以设计一个ImageLoader,实现应该具有的功能是: 图片的同步加载:图片的异步加载:图片的压缩:内存缓存:磁盘缓存:网络获取: 1.加载 首先提到加载:BitmapFactory类提供了四类方法:decodeFile.decodeResource.decodeStream和decideByteArray.分别是文件系统.资源.输入流和字节数加载Bitmap对象. 2.压缩 如何进行图片的压缩?首先我们为什么图片压缩呢?因为很多时候ImageView尺寸小于图片原始尺寸

Android艺术——Bitmap高效加载和缓存代码分析(2)

Bitmap的加载与缓存代码分析: 图片的压缩 比如有一张1024*768像素的图像要被载入内存,然而最终你要用到的图片大小其实只有128*96,那么我们会浪费很大一部分内存,这显然是没有必要的,下面是一个实例: public static int calculateInSampleSize(              BitmapFactory.Options options, int reqWidth, int reqHeight) {      // Raw height and widt

关于Bitmap的加载(二)

接上节,上节记录了Bitmap的加载,用上节的方法,我们可以方便地压缩图片,进行加载. 然而,有时候,当出来大量的图片或者是一张大图要加载时,这一过程所花的时间就会显得很长.甚至长到用户可以感觉出来,即UI的卡顿.因此,我们需要一个方法让图片自己加载去吧,不能干扰用户的操作.所以,我们需要用一个新的线程来完成图片加载的操作.其中最简单便捷的方法,就是Use an AsyncTask. 首先创建一个AsyncTask的子类: class BitmapWorkerTask extends Async

Android 基础 十二 Bitmap的加载和Cache

本章的主题是Bitmap的加载和Cache,主要包含三个方面的内容.首先讲述如何有效地加载一个Bitmap,这是一个很有意义的话题,由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16MB,这导致Bitmap加载的时候很容易出现内存溢出.下面这个异常信息在开发中应该经常遇到: 因此如何高效的加载Bitmap是一个很重要也很容易被开发者或忽视的问题. 接着介绍Android中常用的缓存策略,缓存策略是一种通用的思想,可以用在很多场景中,但是实际开发中经常需要用Bitmap

Bitmap 的加载和 Cache

Android 中如何高效地加载 Bitmap 是一个很重要也很容易被我们忽视的问题. Bitmap 的高效加载 BitmapFactory 类提供了:decodeFile.decodeResource.decodeStream.decodeByteArray 以及 decodeFileDescriptor 等几类方法来加载一个 Bitmap 对象. 高效加载 Bitmap 的核心思想就是设置 BitmapFactory.Options 的 inSampleSize 采样率属性来加载所需尺寸的图

Bitmap的加载和Cache

前提:由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,导致加载Bitmap的时候很容易出现内存溢出. 下面这个一场信息在开发中应该市场遇到: java.lang.OutofMemoryError: bitmap size exceeds VM budget Android实际开发中经常需要用Bitmap做缓存,通过换粗策略,我们不需要每次都从网络上请求图片或者从存储设备中加载图片,这样就极大地提高了图片的加载效率以及产品的用户体验. 目前比较常用的缓存策略是LruCache

第12章 Bitmap的加载和Cache

高效加载 BitmapFactory类提供四种方法: decodeFile:从文件,间接调用decodeStream decodeResource:从资源,间接调用decodeStream decodeStream:输入流 decodeByteArray:字节数组中 使用BitmapFactory.options按一定采样率来加载缩小后图片来避免OOM. public class ImageResizer { private static final String TAG = "ImageRes

Android之Bitmap 高效加载

一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 图片格式(Bitmap.Config) 一张100*100的图片占用内存的大小 ALPHA_8 图片长度*图片宽度 100*100=10000字节 ARGB_4444 图片长度*图片宽度*2 100*100*2=20000字节 ARGB_8888 图片长度*图片宽度*4 100*100*4=40000字节 RGB_565 图片长度*图片宽度*2 100*100*2=20000字节 减小图片内存的方式只有改变,图片的格式

高效使用Bitmaps(一) 大Bitmap的加载

转载:http://my.oschina.net/rengwuxian/blog/182885 高效使用Bitmaps有什么好处? 我们常常提到的“Android程序优化”,通常指的是性能和内存的优化,即:更快的响应速度,更低的内存占用.Android程序的性能和内存问题,大部分都和图片紧密相关,而图片的加载在很多情况下很用到Bitmap(位图)这个类.而由于Bitmap自身的特性(将每个像素的属性全部保存在内存中),导致稍有不慎就会创建出一个占用内存非常大的Bitmap对象,从而导致加载过慢,