Android图片上传,太大需要压缩处理方法2016-01-16 01:13:39
搞Android开发,只要扯到图片就意味着你与OOM相距并不远,图片稍大一点就让人处理起来四处碰壁,有经验的同学可能立马想到,图片是需要压缩处理才能最有效的避免这些问题。
下面首先给出Android压缩图片的方法:
/** * 根据图片实际尺寸和待显示尺寸计算图片压缩比率 * @param options * @param reqWidth 显示宽度 * @param reqHeight 显示高度 * @return 压缩比率 */ public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { //实际宽、高 final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } /** * 根据显示尺寸,获取压缩后的图片 * @param res * @param resId * @param reqWidth 显示宽度 * @param reqHeight 显示高度 * @return */ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); //不压缩,获取实际宽、高 options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // 计算压缩比率 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 设置压缩选项 options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); }
android中的大图片一般都要经过压缩才显示,不然容易发生oom,一般我们压缩的时候都只关注其尺寸方面的大小,其实除了尺寸之外,影响一个图片占用空间的还有其色彩细节。
打开Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, Bitmap.Config config)方法里会用到,打开个这个类一看
枚举变量
public static final Bitmap.Config ALPHA_8
public static final Bitmap.Config ARGB_4444
public static final Bitmap.Config ARGB_8888
public static final Bitmap.Config RGB_565
ALPHA_8, ARGB_4444,ARGB_8888,RGB_565 这是些什么东西
其实这都是色彩的存储方法:我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值
说白了就ALPHA_8就是Alpha由8位组成
ARGB_4444就是由4个4位组成即16位,
ARGB_8888就是由4个8位组成即32位,
RGB_565就是R为5位,G为6位,B为5位共16位
由此可见:
ALPHA_8 代表8位Alpha位图
ARGB_4444 代表16位ARGB位图
ARGB_8888 代表32位ARGB位图
RGB_565 代表8位RGB位图
位图位数越高代表其可以存储的颜色信息越多,当然图像越真。
在压缩之前将option的值设置一下。