【问题标题】:Android - use bitmap as a gradient maskAndroid - 使用位图作为渐变蒙版
【发布时间】:2015-09-22 17:18:41
【问题描述】:

我在一个安卓应用中实现了一个洪水填充算法。我实现算法的方式实际上并没有改变源位图,而是创建了一个新的填充区域位图。即。

洪水用红色填充这个圆圈

将生成此位图(位图中的其他所有内容都是透明的)

然后我将其再次组合成一个位图。这对纯色非常有用,但我希望能够实现渐变泛光填充,这样如果用户填充同一个圆圈,选择红色和蓝色,生成的位图将如下所示

我的问题是,有没有办法可以使用红色圆圈作为某种蒙版来制作所需的渐变?还是我必须自己写一个渐变生成器?

【问题讨论】:

  • 阅读android.graphics.PorterDuffXfermode

标签: java android bitmap gradient


【解决方案1】:

感谢 pskink 的提示,我找到了答案。

这个想法是您创建一个画布,为其绘制蒙版,创建所需的渐变,然后使用 SRC_IN PorterDuffXfermode 在其顶部绘制渐变。代码如下:

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(destination) 是红色圆圈,SRC(source) 是渐变。 SRC_IN PorterDuff 模式意味着在与 DST 相交的任何地方绘制 SRC。

请注意,遮罩是什么颜色并不重要,因为 PorterDuff 模式只关注 DST 像素是否透明。生成的位图的颜色将是 color1 和 color2 之间的渐变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2021-11-21
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多