1

我将掩码与另一个位图一起使用。操作成功,不幸的是,遮罩的结果看到了一个轻微的黑色边框,如图所示:

在此处输入图像描述

如何删除此边框?在源图像中不存在。

我将发布我正在使用的代码:

public Bitmap mask(Bitmap source) {
    Bitmap targetBitmap = Bitmap.createBitmap(getWidth(),getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(targetBitmap);
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    paint.setAntiAlias(true);
    paint.setDither(true);
    canvas.drawBitmap(source, 0, 0, null);
    canvas.drawBitmap(getMask(), 0, 0, paint);
    paint.setXfermode(null);
    return targetBitmap;        
}

其中 getMask() 返回表示拼图图形的位图。希望能得到大家的帮助,谢谢大家

对不起我的英语不好 :-)

更新:

黑色边框是我在这张图片中指出的:

在此处输入图像描述

更新:

放置变换的顺序。第三幅图像与第一幅图像相同,但没有颜色。问题是拼图的黑边。我希望更清楚:

在此处输入图像描述

4

1 回答 1

0

我用蒙版绘制图像的方式与你所做的相反。

public Bitmap mask(Bitmap source) {
    Bitmap targetBitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(targetBitmap);
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    // paint.setAntiAlias(true); // you've already set this in the constructor
    paint.setDither(true);
    canvas.drawBitmap(getMask(), 0, 0, null);
    canvas.drawBitmap(source, 0, 0, paint);
    // paint.setXfermode(null); // no need for this
    return targetBitmap;        
}

请注意,PorterDuff.Mode 设置为 SRC_IN(不是 DST_in),并且首先绘制蒙版,然后在该蒙版上绘制图像。使用这种方法,您还可以将先前的源绘制为基本蒙版,添加新的(拼图)蒙版,然后在其上绘制最终的源/图像,并使用 SRC_IN 绘制每次添加新的拼图。如果这不能解决黑色边框,请检查您的蒙版是否没有可能导致这些问题的羽化(透明)边缘。

此外,ANTI_ALIAS_FLAG 对纹理没有任何作用。如果您想要平滑缩放的纹理,请使用 paint.setFilterBitmap(true);

于 2013-04-17T09:05:44.373 回答