Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将遮罩原位应用于位图_Android_Bitmap_Mask - Fatal编程技术网

Android 将遮罩原位应用于位图

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(

我正在尝试以内存效率最高的方式将椭圆形/圆形遮罩应用于可变位图。输入位图为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(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