Android - 使用位图作为渐变遮罩
Android - use bitmap as a gradient mask
我在 android 应用程序中实施了洪水填充算法。我实现算法的方式实际上并没有改变源位图,而是创建了一个新的填充区域位图。即
用红色填满这个圆圈
将生成此位图(位图中的其他所有内容都是透明的)
然后我将其再次组合成一个位图。这对纯色非常有效,但我希望能够实现渐变填充,这样如果用户填充同一个圆圈,选择红色和蓝色,生成的位图将如下所示
我的问题是,有没有一种方法可以使用红色圆圈作为某种蒙版来制作所需的渐变?还是我必须自己写一个渐变生成器?
多亏了pskink的提示,我才得以找到答案。
想法是创建一个 canvas,为其绘制遮罩,创建所需的渐变,然后使用 SRC_IN PorterDuffXfer 模式在其上绘制渐变。这是代码:
public Bitmap addGradient(Bitmap src, int color1, int color2)
{
int w = src.getWidth();
int h = src.getHeight();
Bitmap result = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(src, 0, 0, null);
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,0,0,h, color1, color2, Shader.TileMode.CLAMP);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawRect(0,0,w,h,paint);
return result;
}
在此实例中,DST(目标)是红色圆圈,SRC(源)是渐变。 SRC_IN PorterDuff 模式意味着在与 DST 相交的任何地方绘制 SRC。
注意mask是什么颜色真的不重要,因为PorterDuff模式只关注DST像素是否透明。生成的位图的颜色将是 color1 和 color2 之间的渐变。
我在 android 应用程序中实施了洪水填充算法。我实现算法的方式实际上并没有改变源位图,而是创建了一个新的填充区域位图。即
用红色填满这个圆圈
将生成此位图(位图中的其他所有内容都是透明的)
然后我将其再次组合成一个位图。这对纯色非常有效,但我希望能够实现渐变填充,这样如果用户填充同一个圆圈,选择红色和蓝色,生成的位图将如下所示
我的问题是,有没有一种方法可以使用红色圆圈作为某种蒙版来制作所需的渐变?还是我必须自己写一个渐变生成器?
多亏了pskink的提示,我才得以找到答案。
想法是创建一个 canvas,为其绘制遮罩,创建所需的渐变,然后使用 SRC_IN PorterDuffXfer 模式在其上绘制渐变。这是代码:
public Bitmap addGradient(Bitmap src, int color1, int color2)
{
int w = src.getWidth();
int h = src.getHeight();
Bitmap result = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(src, 0, 0, null);
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,0,0,h, color1, color2, Shader.TileMode.CLAMP);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawRect(0,0,w,h,paint);
return result;
}
在此实例中,DST(目标)是红色圆圈,SRC(源)是渐变。 SRC_IN PorterDuff 模式意味着在与 DST 相交的任何地方绘制 SRC。
注意mask是什么颜色真的不重要,因为PorterDuff模式只关注DST像素是否透明。生成的位图的颜色将是 color1 和 color2 之间的渐变。