所以我从根本上不理解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);
我觉得我已经尝试了ColorFilter, XferMode的每种组合,甚至以相反的顺序绘制图像,但似乎没有任何效果。我觉得我只是完全误解了PorterDuff模式是如何工作的(基于http://ssp.impulsetrain.com/porterduff.html上我的很多信息)。
如果有人对如何实现这一点有任何见解,我应该使用什么portterduff模式的见解,我是否应该使用ColorFilter或XferMode,我真的很感激它。
Thanks in advance
可能我迟到了,但解决方案是使背景透明,这样你就可以得到你已经知道如何使用的alpha蒙版。这是一个CSharp的辅助方法,可以将B/W图像转换为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;
}