2015-08-18 37 views
2

所以我有以下的图像被用作面膜:如何应用具有边框的自定义图像蒙版?

enter image description here

现在我想这个面膜适用于图像,使图像将填补内心的空白,但不会填补了边界,保持原样。但是,当我使用下面的代码时,图像采用内部空白加边框。

public static Bitmap applyMask(Bitmap scaledBitmap, Bitmap mask) { 
    Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas mCanvas = new Canvas(result); 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
    mCanvas.drawBitmap(scaledBitmap, 0, 0, null); 
    mCanvas.drawBitmap(mask, 0, 0, paint); 
    paint.setXfermode(null); 
    return result; 
} 

那么有什么办法让图像只填充空白?我怎样才能保持面具边框完整?

在此先感谢。

回答

1

我不得不下载您的图片才能看到透明区域。它们位于你的外形之外(这就是为什么DST_IN是适用于此模式的原因)。

DST_IN模式的作用是擦除画布上已经存在的像素中透明像素的任何像素。因此,无论是黑色边框还是白色内部,这些像素都具有alpha> 0,因此它们掩盖的画布也是一样的。这些形状外的像素具有alpha == 0,因此它们会擦除画布像素。

因为最终的位图是你的面具的大小,因为我看到它,你有两个选择:

  • 选项1:如果你可以把背景颜色的掩模图像的:

    改变你的蒙版图像,使的透明像素在的形状内,并且形状外的像素是你的背景色。然后使用SRC_OVER作为你的xfer模式。边界外的背景颜色加上黑色边框将覆盖此模式下的现有像素,并且由于内部像素是透明的,因此图像的中间部分将以您想要的方式呈现。

  • 选项2:如果您必须指定应用程序的背景颜色,所以你不能把它的掩模图像的:

    对于这一点,您需要两个掩模图像,你有一个和内部像素也是透明的,所以你留下了边框。使用DST_IN和您的蒙版图像一起绘制您现在正在使用的方式,然后使用SRC_OVER在边界上绘制图像,以便在蒙版图像顶部绘制边框。

+0

是的,我们目前有选项2实现,但我们正在寻找一个解决方案,不需要第二个图像,因为我们担心apk大小。不幸的是选项1不适合我们。感谢你的回答。 –

0

在这里,你有你想要的一个例子,你可以使其适应你的情况:

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) { 
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), 
     bitmap.getHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(output); 

    final int color = 0xff424242; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
    final RectF rectF = new RectF(rect); 
    final float roundPx = 12; 

    paint.setAntiAlias(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    paint.setColor(color); 
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 

    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 

    return output; 
} 

我发现它here。希望能帮助到你! :)