4

因此,我将以下图像用作蒙版:

在此处输入图像描述

现在我想将此蒙版应用于图像,以便图像填充内部空白但不会填充边框,保持原样。但是,当我使用下面的代码时,图像会占用内部空白加上边框。

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

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

提前致谢。

4

2 回答 2

2

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

DST_IN 模式所做的是擦除画布上已经存在的任何像素,其中蒙版中的像素是透明的。所以无论是黑色边框还是里面的白色,这些像素的 alpha > 0,所以它们对画布的遮罩是一样的。形状外的那些像素具有 alpha == 0,因此它们会擦除画布像素。

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

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

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

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

    为此,您需要两个蒙版图像,一个是您拥有的,另一个是内部像素透明的副本,因此您只剩下边框。按照您现在使用 DST_IN 的方式绘制蒙版图像,然后使用 SRC_OVER 仅使用边框绘制图像,在蒙版图像的顶部绘制边框。

于 2015-08-18T16:44:11.670 回答
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;
}

我在这里找到了。希望能帮助到你!:)

于 2015-08-19T07:12:28.907 回答