所以我将以下图像用作遮罩:
现在我想将此蒙版应用于图像,以便图像将填充内部空白区域,但不会填充边框,保持原样。但是,当我使用下面的代码时,图像采用内部空白加边框。
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;
}
那么有没有办法让图像只填充白色空间?如何保持面具边框完好无损?
提前致谢。
答案 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。希望能帮助到你! :)