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

Android 图片二次采样

2018-01-30 15:14 351 查看
今天分享一下图片的二次采样。

一、为什么进行图片二次采样

 我们在开发APP时,总会遇见图片加载与图片上传的问题,如果一张图片的大小超过了10MB,或许觉得没有什么问题,但是10张、100张甚至更多的时候,那么内存中就会有很大的占有率,可能就会出现OOM(内存不足)。

 而二次采样就是对一些大图进行压缩,缩小图片的大小,并且不会影响视觉上的体验。

二、图片二次采样思路

顾名思义,二次采样要对图片进行二次采样(废话)

二次采样的操作是什么呢:

 1、根据原图片的宽高得到一个比例值

2、根据第一次采样得到的比例值,对原图片进行压缩

三、相关代码

 我们的二次采样是根据 Bitmap 对图片进行编辑,大家可以了解一下Bitmap;

  首先我们进行第一次采样:

public static int calculateSampleSize(BitmapFactory.Options options, int imageWidth, int imageHeight){

//获得 原图片的 宽高
int outWidth = options.outWidth;
int outHeight = options.outHeight;

/**
* inSampleSize:
 *
这个值是一个int,当它小于1的时候,将会被当做1处理,如果大于1,
那么就会按照比例(1 / inSampleSize)缩小bitmap的宽和高、降低分辨率,
大于1时这个值将会被处置为2的倍数。例如,width=100,height=100,inSampleSize=2,
那么就会将bitmap处理为,width=50,height=50,宽高降为1 / 2,像素数降为1 / 4。
*/
int sampleSize = 1;

while(outWidth / sampleSize > imageWidth || outHeight / sampleSize >imageHeight){
sampleSize *= 3;
}
return sampleSize;
}
 第二次采样:

public static Bitmap decodeResourceImage(Resources res, int resId, int imageWidth, int imageHeight){

//通过 BitmapFactory 对 Bitmap 进行解码
//options 是对解码的 Bitmap 的各种参数进行控制
BitmapFactory.Options options = new BitmapFactory.Options();

// 将 inJustDecodeBounds 设置为 true ,解码时将不反返回 bitmap, 只会返回 这个 bitmap 的尺寸
options.inJustDecodeBounds = true;

BitmapFactory.decodeResource(res,resId,options);

/**
* inSampleSize :
* inSampleSize 是 int值;
* 如果 inSampleSize < 1 ,会当做 1 来处理
* 如果 inSampleSize > 1 ,会按照 1/inSampleSize 的比例缩小 bitmap 的宽和高
*/
options.inSampleSize = calculateSampleSize(options, imageWidth, imageHeight);

options.inJustDecodeBounds = false;

//返回 bitmap
return BitmapFactory.decodeResource(res,resId,options);
}

 我在代码中也给出了注释,大家细细品味;
 我做的二次采样是对资源文件中图片的操作,还可以对网络及本地图片进行二次采样的操作,当然只是换汤不换药;

 通过BitmapFactory 对不同的图片进行
BitmapFactory.decodeResource(); //资源文件
BitmapFactory.decodeFile(); //本地
BitmapFactory.decodeStream(); //字节流 关于图片的二次采样就到这里,希望可以帮助到大家,不足之处请指出
本篇Demo-------->
传送门

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: