Java tutorial
//package com.java2s; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; public class Main { public static final int PAINT_FLAGS = Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.FILTER_BITMAP_FLAG; /** * A potentially expensive operation to crop the given Bitmap so that it fills the given dimensions. This operation * is significantly less expensive in terms of memory if a mutable Bitmap with the given dimensions is passed in * as well. * * @param recycled A mutable Bitmap with dimensions width and height that we can load the cropped portion of toCrop * into * @param toCrop The Bitmap to resize * @param width The width of the final Bitmap * @param height The height of the final Bitmap * @return The resized Bitmap (will be recycled if recycled is not null) */ public static Bitmap centerCrop(Bitmap recycled, Bitmap toCrop, int width, int height) { if (toCrop == null) { return null; } else if (toCrop.getWidth() == width && toCrop.getHeight() == height) { return toCrop; } //from ImageView/Bitmap.createScaledBitmap //https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/ImageView.java //https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/graphics/java/android/graphics/Bitmap.java final float scale; float dx = 0, dy = 0; Matrix m = new Matrix(); if (toCrop.getWidth() * height > width * toCrop.getHeight()) { scale = (float) height / (float) toCrop.getHeight(); dx = (width - toCrop.getWidth() * scale) * 0.5f; } else { scale = (float) width / (float) toCrop.getWidth(); dy = (height - toCrop.getHeight() * scale) * 0.5f; } m.setScale(scale, scale); m.postTranslate((int) dx + 0.5f, (int) dy + 0.5f); final Bitmap result; if (recycled != null) { result = recycled; } else { result = Bitmap.createBitmap(width, height, toCrop.getConfig() == null ? Bitmap.Config.ARGB_8888 : toCrop.getConfig()); } Canvas canvas = new Canvas(result); Paint paint = new Paint(PAINT_FLAGS); canvas.drawBitmap(toCrop, m, paint); return result; } }