Android使用PorterDuff来组合图像

Sta*_*kJP 5 android bitmap porter-duff android-bitmap

所以我从根本上不了解PorterDuff及其各种模式.我有两个想要合并的图像,一个是航拍图像,另一个是遮盖在天线上的alpha遮罩,所以只有某些部分可以显示.我有一个系统,我可以正确地将掩模覆盖到另一个图像上,只有它通过,但问题是,在这种情况下,我必须有一个背景颜色,我需要它是透明的.(类似于Android中使用黑白alpha蒙版进行高效位图屏蔽的问题)

Bitmap thumbnail = Bitmap.createBitmap(mThumbnailSize, mThumbnailSize, Config.ARGB_8888);
Canvas canvas = new Canvas(thumbnail);

Paint paint = new Paint();
paint.setFilterBitmap(true);
canvas.drawColor(Color.TRANSPARENT);
canvas.drawBitmap(aerial, transformation, paint);

paint = new Paint();
paint.setFilterBitmap(true);
paint.setColorFilter(new PorterDuffColorFilter(Color.WHITE,PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(overlay, transformation, paint);
Run Code Online (Sandbox Code Playgroud)

我觉得我已经尝试了ColorFilter,XferMode的每个组合,甚至以相反的顺序绘制图像,但似乎没有任何效果.我觉得我只是完全误解了PorterDuff模式是如何工作的(基于http://ssp.impulsetrain.com/porterduff.html上的大量信息).

如果有人对如何实现这一点有任何见解,请深入了解我应该使用什么PorterDuff模式,无论我应该使用ColorFilter还是XferMode,我都会非常感激.

提前致谢

zav*_*kas 0

也许我迟到了,但解决方案是使背景透明,这样你就可以得到你已经知道如何使用的 alpha 蒙版。这是一个 CSharp 辅助方法,用于将黑白图像转换为 alpha 蒙版。

private static Bitmap ConvertToAlphaMask(Bitmap mask)
{
        float[] src = {
                    0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0,
                    0.3f, 0.59f, 0.11f, 0, 0,
                    };

    var colorMatrix = new ColorMatrix(src);
    var filter = new ColorMatrixColorFilter(colorMatrix);
    var maskPaint = new Paint();
    maskPaint.SetColorFilter(filter);

    var alphaMask = Bitmap.CreateBitmap(mask.Width, mask.Height, Bitmap.Config.Argb8888);
    var canvas = new Canvas(alphaMask);
    canvas.DrawBitmap(mask, 0, 0, maskPaint);

    return alphaMask;
}
Run Code Online (Sandbox Code Playgroud)