package me.xiaopan.sketch.process; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import me.xiaopan.sketch.Sketch; import me.xiaopan.sketch.cache.BitmapPool; import me.xiaopan.sketch.request.Resize; /** * 在图片上面个盖上一层颜色,可兼容形状不规则的透明图片 */ public class MaskImageProcessor extends WrappedImageProcessor { protected String logName = "MaskImageProcessor"; private Paint paint; private int maskColor; public MaskImageProcessor(int maskColor, WrappedImageProcessor wrappedProcessor) { super(wrappedProcessor); this.maskColor = maskColor; } public MaskImageProcessor(int maskColor) { this(maskColor, null); } /** * 获取遮罩颜色 */ @SuppressWarnings("unused") public int getMaskColor() { return maskColor; } @Override public String onGetKey() { return String.format("%s(maskColor=%d)", logName, maskColor); } @Override public Bitmap onProcess(Sketch sketch, Bitmap bitmap, Resize resize, boolean forceUseResize, boolean lowQualityImage) { if (bitmap == null || bitmap.isRecycled()) { return bitmap; } BitmapPool bitmapPool = sketch.getConfiguration().getBitmapPool(); Bitmap.Config newBitmapConfig = bitmap.getConfig(); if (newBitmapConfig == null) { newBitmapConfig = lowQualityImage ? Bitmap.Config.ARGB_4444 : Bitmap.Config.ARGB_8888; } Bitmap maskBitmap; boolean isNewBitmap = false; if (bitmap.isMutable()) { maskBitmap = bitmap; } else { maskBitmap = bitmapPool.getOrMake(bitmap.getWidth(), bitmap.getHeight(), newBitmapConfig); isNewBitmap = true; } Canvas canvas = new Canvas(maskBitmap); if (isNewBitmap) { canvas.drawBitmap(bitmap, 0, 0, null); } if (paint == null) { paint = new Paint(); paint.setColor(maskColor); } paint.setXfermode(null); int saveFlags = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG; int src = canvas.saveLayer(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint, saveFlags); canvas.drawBitmap(bitmap, 0, 0, null); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint); canvas.restoreToCount(src); return maskBitmap; } }