如何应用带边框的自定义图像蒙版?

时间:2015-08-18 13:41:25

标签: android android-imageview android-bitmap porter-duff

所以我将以下图像用作遮罩:

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;
}

那么有没有办法让图像只填充白色空间?如何保持面具边框完好无损?

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

DST_IN模式的作用是擦除画布上已有掩模中像素透明的所有像素。因此,无论是暗边框还是内部白色,这些像素都具有alpha> 0,所以他们掩盖了画布一样。形状外的那些像素具有alpha == 0,因此它们会擦除画布像素。

由于最终的位图是蒙版的大小,我认为你有两个选择:

  • 选项1:如果可以将背景颜色放在蒙版图像中:

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

  • 选项2:如果您必须在应用中指定背景颜色,则无法将其放入蒙版图像中:

    为此你需要两个蒙版图像,你拥有的图像和内部像素的副本也是透明的,所以你留下了边框。使用DST_IN以您现在正在使用DST_IN的方式绘制掩模图像,然后使用SRC_OVER绘制带有边框的图像,以在蒙面图像上绘制边框。

答案 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。希望能帮助到你! :)