您的位置:首页 > 移动开发 > Android开发

android图片处理

2015-11-17 18:06 441 查看

anroid 如何加载大图:

    对android手机开发者来说,图片一直都是一个让人头疼的问题,因为手机的内存是有限的,

要让程序在有限的内存下工作,加载合适的图片显得尤为重要,图片过大不但对程序没有任何的

帮助,反而消耗内存,图片过小会导致显示模糊,以下将会介绍如何加载一个缩小版的图片,从

而避免超出内存限制。

1、读取位图的尺寸与类型

BitmapFactory提供了一些解码(decode)的方法(decodeByteArray(),decodeFile(),

decodeResource()等),用来从不同的资源中创建一个Bitmap。我们应该根据图片的数据来源选

择合适的解码方法。但是这些方法在构造位图的时候会尝试分配内存,因此直接使用会容易导致

内存溢出(outOfMemory)。庆幸的是每一种解码方法都可以通过BitmapFactory.Options设置一

些附加的标记,以此来指定解码选项。设置inJustDecodebounds属性为true时这些方法在解码时

不会分配内存,它会返回一个null的Bitmap,但是可以获取到outWidth,outHeight与outMimeType。

该方法允许你在构造Bitmap之前优先读取图片的尺寸与类型。

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeResource(getResource(),R.id.image,options);

int imageWidth = options.outWidth;

int imageHeight = options.outHeight;

String imageType = options.outMimeType;

为了避免OOM的异常,我们需要在真正解析图片之前检查它的尺寸。

2、加载一个按比例缩小的版本到内存中

    通过得到的参数可以帮助我们决定应该加载整个图片到内存中还是加载一个缩小的图片。

例如,如果把一个大小为1024*768像素的图片显示到大小为128*96像素的ImageView上,就没有

必要把整张图片都加载到内存中。

BitmapFactory.Options中提供了一个属性 inSampleSize ,该属性可以向图片按倍数缩小,

例如:一个分辨率为2048*1536的图片如果设置inSampleSize = 4,那么会产生一个大约512*384

大小的Bitmap。以下是根据目标图片大小来计算Sample图片大小的代码。

public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){

    int height = options.outHeight;

    int width = options.outWidth;

    int inSampleSize = 1;

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

        int halfHeight = height/2;

        int halfWidth = width/2;

        while(halfHeight/inSampleSize > reqHeight && halfWidth/inSampleSize > reqWidth){

            inSampleSize *= 2;

        }

    }

    return inSampleSize;

}

使用该方法时首先需要设置inJustDecodeBounds = true,把options的值传递过来,计算并设置inSampleSize的

值后,需要设置inJustDecodeBounds = false,之后再调用相关解码方法。

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,

        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions

    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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 图像处理