本文主要介绍如何使用Bitmap压缩高清图片。
如果我们使用Bitmap加载高清图片很容易造成OOM,同时在很多时候,我们可以对这种高清图片进行压缩。主要使用到的是BitmapFactory.Options。
一、代码段
BitmapFactory.Options options = getBitmapFactory(R.drawable.ceshi, 500, 400);
img.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ceshi, options));
public BitmapFactory.Options getBitmapFactory(int id, int pixelW, int pixelH){
BitmapFactory.Options options = new BitmapFactory.Options();
//inJustDecodeBounds为true,不返回bitmap,只返回这个bitmap的尺寸
options.inJustDecodeBounds = true;
//设置图片色彩
options.inPreferredConfig = Bitmap.Config.RGB_565;
//预加载图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id, options);
//获取原始图片宽高
int originalW = options.outWidth;
int originalH = options.outHeight;
Log.e("Bitmap", "originalW" + originalW);
Log.e("Bitmap", "originalH" + originalH);
//上面设置为true获取bitmap尺寸大小,在这里一定要重新设置为false,否则位图加载不出来
options.inJustDecodeBounds = false;
options.inSampleSize = getSampleSize(originalW,originalH,pixelW,pixelH);
return options;
}
/**
*
* @param originalW 原图宽
* @param originalH 原图高
* @param pixelW 指定图片宽度
* @param pixelH 指定图片高度
* @return 返回原图缩放大小
*/
private int getSampleSize(int originalW, int originalH, int pixelW, int pixelH) {
int simpleSize = 1;
if (originalW > originalH && originalW > pixelW) {
simpleSize = originalW / pixelW;
}else if (originalH > originalW && originalH > pixelH){
simpleSize = originalH / pixelH;
}
if (simpleSize <= 0) {
simpleSize = 1;
}
Log.e("Bitmap", "simpleSize" + simpleSize);
return simpleSize;
}
二、相关参数介绍
1.inJustDecodeBounds:
如果将这个值置为true,在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸。这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时。这是一个非常有用的属性。
2.inPreferredConfig:
这个值是设置色彩模式,默认值是ARGB_8888,在这个模式下,一个像素点占用4bytes空间,一般对透明度不做要求的话,一般采用RGB_565模式,这个模式下一个像素点占用2bytes。(类型主要有ALPHA_8、RGB_565、ARGB_4444、ARGB_8888 A)ARGB_4444失真严重,基本不用。
3.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。