java - Android - 使用位图作为渐变 mask

标签 java android bitmap gradient

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

用红色填充这个圆圈

circle

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

red

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

redblue

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

最佳答案

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

想法是您创建一个 Canvas ,在其上绘制 mask ,创建您想要的渐变,然后使用 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 之间的渐变。

关于java - Android - 使用位图作为渐变 mask ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32723026/

相关文章:

java - 如何使用按钮单击 Intent 打开已安装的 Android 应用程序?

java - 如何同时在不同的linux系统上运行一个jar

Java、线程和优先级

java - 如何调用 setMargins();在android中的自定义ViewGroup上?

c# - 如何调整 PDF 文档的大小以适合位图

java - 如何设置jtable中目标单元格的背景颜色?

java - Android RunOnUIThread 不会永久改变 View 可见性

Android 可点击 ListView

swift - 将[UInt8]转换为白色透明图像

android - Android Bitmap.getPixels()从BufferedImage.getRGB()返回不同的数据