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-------->
传送门
一、为什么进行图片二次采样
我们在开发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-------->
传送门
相关文章推荐
- Android中图片的二次采样示例
- Android 图片二次采样、质量压缩
- Android 图片二次采样、质量压缩
- android 图片二次采样,质量压缩,LruCache缓存
- android图片二次采样(缩略图)
- Android_Bitmap_图片的二次采样并生成缩略图
- android 图片的二次采样
- Android开发中图片二次采样(sd卡中图片)
- Android 图片二次采样、质量压缩
- 初学者---Android 图片二次采样
- Android_Bitmap_图片的二次采样并生成缩略图
- android高级之图片二次采样
- Android BitmapFactory图片压缩处理(大位图二次采样压缩处理)
- Android_Bitmap_图片的二次采样并生成缩略图
- Android_Bitmap_图片的二次采样并生成缩略图
- Android_Bitmap_图片的二次采样并生成缩略图
- Android_Bitmap_图片的二次采样并生成缩略图
- Android_Bitmap_图片的二次采样并生成缩略图
- Android加载大图片时的OOM异常及解决(图片的二次采样)
- Android_Bitmap_图片的二次采样并生成缩略图