关闭

android图片处理

标签: android图像处理
157人阅读 评论(0) 收藏 举报
分类:

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

}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38593次
    • 积分:989
    • 等级:
    • 排名:千里之外
    • 原创:60篇
    • 转载:3篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论