本文主要介绍如何使用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。