Android 将遮罩原位应用于位图
我正在尝试以内存效率最高的方式将椭圆形/圆形遮罩应用于可变位图。输入位图为ARGB_8888格式。我的意图是在ALPH_8位图中绘制一个椭圆形/圆形,然后将生成的位图用作输入位图上的遮罩。我的守则如下:Android 将遮罩原位应用于位图,android,bitmap,mask,Android,Bitmap,Mask,我正在尝试以内存效率最高的方式将椭圆形/圆形遮罩应用于可变位图。输入位图为ARGB_8888格式。我的意图是在ALPH_8位图中绘制一个椭圆形/圆形,然后将生成的位图用作输入位图上的遮罩。我的守则如下: protected final static RectF rectF = new RectF(); protected final static Rect rect = new Rect(); protected final static Paint ovalPaint = new Paint(
protected final static RectF rectF = new RectF();
protected final static Rect rect = new Rect();
protected final static Paint ovalPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
protected final static Paint maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
static {
maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
}
/**
* Apply oval mask to bitmap
*
* @param srcImage
* reference to bitmap image to which mask is applied
* @return reference to resulting bitmap (may be same as bitmap passed)
*/
private Bitmap applyImageMAsk(Bitmap srcImage) {
final int width = srcImage.getWidth();
final int height = srcImage.getHeight();
Bitmap mask = Bitmap.createBitmap(width, height, Config.ALPHA_8);
final Canvas canvas = new Canvas(mask);
rect.right = width;
rect.bottom = height;
rectF.set(rect);
canvas.drawOval(rectF, ovalPaint);
**//mask = mask.copy(Config.ARGB_8888, false);**
canvas.setBitmap(srcImage);
canvas.drawBitmap(mask, rect, rect, maskPaint);
return srcImage;
}
这不起作用,没有应用遮罩。但是,如果我取消对mask.copy行的注释,从而有效地生成了椭圆形mask的am ARGB_8888副本,那么它就可以完美地工作。显然,仅使用ALPHA_8位映射将大大提高内存效率,我想了解为什么这不起作用。尝试Canvas.saveLayer(),据我所知,使用saveLayer会分配一个屏幕外缓冲区!这不会违背我最小化内存使用的目标吗?这不像位图那样是一个“普通”缓冲区,它是一个GPU层,例如在v2中。*android使用该缓冲区绘制AlphaAnimation的每一步,因此,如果在20帧中绘制,则在几秒钟内调用20次saveLayer