从网上一个开源的库中整理出来的:
1. 裁剪
/** * 裁剪图片 * * @param src 源图片 * @param x 开始坐标x * @param y 开始坐标y * @param width 裁剪宽度 * @param height 裁剪高度 * @param recycle 是否回收 * @return 裁剪后的图片 */ public static Bitmap clip(Bitmap src, int x, int y, int width, int height, boolean recycle) { if (isEmptyBitmap(src)) return null; Bitmap ret = Bitmap.createBitmap(src, x, y, width, height); if (recycle && !src.isRecycled()) src.recycle(); return ret; }
2. 缩放
/** * 缩放图片 * * @param src 源图片 * @param scaleWidth 缩放宽度倍数 * @param scaleHeight 缩放高度倍数 * @param recycle 是否回收 * @return 缩放后的图片 */ public static Bitmap scale(Bitmap src, float scaleWidth, float scaleHeight, boolean recycle) { if (isEmptyBitmap(src)) return null; Matrix matrix = new Matrix(); matrix.setScale(scaleWidth, scaleHeight); Bitmap ret = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true); if (recycle && !src.isRecycled()) src.recycle(); return ret; }3, 倾斜 /** * 倾斜图片 * * @param src 源图片 * @param kx 倾斜因子x * @param ky 倾斜因子y * @param px 平移因子x * @param py 平移因子y * @param recycle 是否回收 * @return 倾斜后的图片 */ public static Bitmap skew(Bitmap src, float kx, float ky, float px, float py, boolean recycle) { if (isEmptyBitmap(src)) return null; Matrix matrix = new Matrix(); matrix.setSkew(kx, ky, px, py); Bitmap ret = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true); if (recycle && !src.isRecycled()) src.recycle(); return ret; } 4. 圆形图片 /** * 转为圆形图片 * * @param src 源图片 * @param recycle 是否回收 * @return 圆形图片 */ public static Bitmap toRound(Bitmap src, boolean recycle) { if (isEmptyBitmap(src)) return null; int width = src.getWidth(); int height = src.getHeight(); int radius = Math.min(width, height) >> 1; Bitmap ret = Bitmap.createBitmap(width, height, src.getConfig()); Paint paint = new Paint(); Canvas canvas = new Canvas(ret); Rect rect = new Rect(0, 0, width, height); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); canvas.drawCircle(width >> 1, height >> 1, radius, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(src, rect, rect, paint); if (recycle && !src.isRecycled()) src.recycle(); return ret; } 5. 模糊 /** * 快速模糊图片 * <p>先缩小原图,对小图进行模糊,再放大回原先尺寸</p> * * @param context 上下文 * @param src 源图片 * @param scale 缩放比例(0...1) * @param radius 模糊半径 * @param recycle 是否回收 * @return 模糊后的图片 */ public static Bitmap fastBlur(Context context, Bitmap src, float scale, float radius, boolean recycle) { if (isEmptyBitmap(src)) return null; int width = src.getWidth(); int height = src.getHeight(); int scaleWidth = (int) (width * scale + 0.5f); int scaleHeight = (int) (height * scale + 0.5f); if (scaleWidth == 0 || scaleHeight == 0) return null; Bitmap scaleBitmap = Bitmap.createScaledBitmap(src, scaleWidth, scaleHeight, true); Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG); Canvas canvas = new Canvas(); PorterDuffColorFilter filter = new PorterDuffColorFilter( Color.TRANSPARENT, PorterDuff.Mode.SRC_ATOP); paint.setColorFilter(filter); canvas.scale(scale, scale); canvas.drawBitmap(scaleBitmap, 0, 0, paint); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { scaleBitmap = renderScriptBlur(context, scaleBitmap, radius); } else { scaleBitmap = stackBlur(scaleBitmap, (int) radius, recycle); } if (scale == 1) return scaleBitmap; Bitmap ret = Bitmap.createScaledBitmap(scaleBitmap, width, height, true); if (scaleBitmap != null && !scaleBitmap.isRecycled()) scaleBitmap.recycle(); if (recycle && !src.isRecycled()) src.recycle(); return ret; }