Java tutorial
//package com.java2s; //License from project: Open Source License import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Build; import android.util.TypedValue; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; public class Main { private static final int DECODE_BUFFER_SIZE = 16 * 1024; private static final int DENSITY_240 = 240; private static final int DENSITY_400 = 400; private static final float SCALE_FACTOR = 0.8f; private static final float SCALE_FACTOR_2 = 0.7f; private static final Bitmap.Config DEFAULT_BITMAP_CONFIG = Bitmap.Config.RGB_565; public static Bitmap compressBitmap(Context context, int resId, int maxWidth, int maxHeight) { checkParam(context); final TypedValue value = new TypedValue(); InputStream is = null; try { is = context.getResources().openRawResource(resId, value); return compressBitmap(context, is, maxWidth, maxHeight); } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } public static Bitmap compressBitmap(Context context, String pathName, int maxWidth, int maxHeight) { checkParam(context); InputStream is = null; try { is = new FileInputStream(pathName); return compressBitmap(context, is, maxWidth, maxHeight); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } public static Bitmap compressBitmap(Context context, InputStream is, int maxWidth, int maxHeight) { checkParam(context); checkParam(is); BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inJustDecodeBounds = true; BitmapFactory.decodeStream(is, null, opt); int height = opt.outHeight; int width = opt.outWidth; int sampleSize = computeSampleSize(width, height, maxWidth, maxHeight); BitmapFactory.Options options = getBitmapOptions(context); options.inSampleSize = sampleSize; return BitmapFactory.decodeStream(is, null, options); } private static <T> void checkParam(T param) { if (param == null) throw new NullPointerException(); } private static int computeSampleSize(int width, int height, int maxWidth, int maxHeight) { int inSampleSize = 1; if (height > maxHeight || width > maxWidth) { final int heightRate = Math.round((float) height / (float) maxHeight); final int widthRate = Math.round((float) width / (float) maxWidth); inSampleSize = heightRate < widthRate ? heightRate : widthRate; } if (inSampleSize % 2 != 0) { inSampleSize -= 1; } return inSampleSize <= 1 ? 1 : inSampleSize; } private static BitmapFactory.Options getBitmapOptions(Context context) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inScaled = true; options.inPreferredConfig = DEFAULT_BITMAP_CONFIG; options.inPurgeable = true; options.inInputShareable = true; options.inJustDecodeBounds = false; options.inTempStorage = new byte[DECODE_BUFFER_SIZE]; if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { Field field = null; try { field = BitmapFactory.Options.class.getDeclaredField("inNativeAlloc"); field.setAccessible(true); field.setBoolean(options, true); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } int displayDensityDpi = context.getResources().getDisplayMetrics().densityDpi; float displayDensity = context.getResources().getDisplayMetrics().density; int density = 0; if (displayDensityDpi > DENSITY_240 && displayDensityDpi <= DENSITY_400 && displayDensity > 1.5f) { density = (int) (displayDensityDpi * SCALE_FACTOR); } else if (displayDensityDpi > DENSITY_400 && displayDensity > 2.5f) { density = (int) (displayDensityDpi * SCALE_FACTOR_2); } if (density == 0) return options; options.inDensity = density; options.inTargetDensity = density; return options; } }