android上的洪水填充着色

Posted

技术标签:

【中文标题】android上的洪水填充着色【英文标题】:flood fill coloring on android 【发布时间】:2014-04-28 12:37:00 【问题描述】:

我只是尝试使用 FloodFill 类,但我发现了一个奇怪的着色问题。

让我们从代码开始:

public class FloodFill 
public void floodFill(Bitmap  image, Point node, int targetColor,
        int replacementColor) 
    int width = image.getWidth();
    int height = image.getHeight();
    int target = targetColor;
    int replacement = replacementColor;
    if (target != replacement) 
        Queue<Point> queue = new LinkedList<Point>();
        do 
            int x = node.x;
            int y = node.y;
            while (x > 0 && image.getPixel(x - 1, y) == target) 
                x--;
            
            boolean spanUp = false;
            boolean spanDown = false;
            while (x < width && image.getPixel(x, y) == target) 
                image.setPixel(x, y, replacement);
                if (!spanUp && y > 0 && image.getPixel(x, y - 1) == target) 
                    queue.add(new Point(x, y - 1));
                    spanUp = true;
                 else if (spanUp && y > 0
                        && image.getPixel(x, y - 1) != target) 
                    spanUp = false;
                
                if (!spanDown && y < height - 1
                        && image.getPixel(x, y + 1) == target) 
                    queue.add(new Point(x, y + 1));
                    spanDown = true;
                 else if (spanDown && y < height - 1
                        && image.getPixel(x, y + 1) != target) 
                    spanDown = false;
                
                x++;
            
         while ((node = queue.poll()) != null);
    


以及我使用 FloodFill 的方法:

public void colorize()
    
        bmp = ((BitmapDrawable)view.getDrawable()).getBitmap();

        view.setOnTouchListener(new ImageView.OnTouchListener()
        
            @Override
            public boolean onTouch(View v, MotionEvent event)
            
                int x = (int)event.getX();
                int y = (int)event.getY();

                ...

                flood.floodFill(bmp, new Point(x, y), bmp.getPixel(x, y), color);
                view.setImageBitmap(bmp);

                ...
            
        );
    

如果我尝试使用标准 android 颜色 f.g:Color.RED 和 Color.GREEN,一切正常。我可以用绿色替换 f.g red 它的作品,但如果我尝试使用这样的自定义颜色:f.g. Color.rgb(34, 198, 67) 我得到单点颜色而不是填充形状。

你能帮我找到解决这个问题的方法吗?

编辑1:

我发现了一些有趣的东西。自定义颜色在某些像素上似乎是不同的值,但我不知道为什么如果我使用洪水填充。

【问题讨论】:

你能分享这段代码的完整实现吗,我的项目需要它。 嗨@ZiaUrRahman,抱歉,这是不可能的。这段代码是为商业产品编写的,归我以前工作的公司所有。我再也无法访问这个项目了。我希望你能找到一种方法让它在你的项目中发挥作用。 感谢您的回复。我并不是要给出完整的项目,只是希望您在 MainActivity 中使用 colorize(),我想看看它是如何工作的(通过触摸不同的边界来填充该区域)......然后是我的项目的其余部分,我会按照我的要求去做。希望你在这方面帮助我。谢谢。 @ZiaUrRahman 老实说,我不记得我是如何使用这段代码的,但我很确定我在这里找到了它:How to use flood fill algorithm in Android? 有一些关于视图和活动的内容。到现在 3 年了,我不在 android 上工作,所以可能会有很多变化。我记得这段代码是在 android 4.0 上测试的。 【参考方案1】:

问题解决了。我使用洪水填充的位图是 RGB_565。我只是将它转换为 ARGB_8888,一切正常。

【讨论】:

以上是关于android上的洪水填充着色的主要内容,如果未能解决你的问题,请参考以下文章

iPad绘画应用程序上的递归洪水填充

Android 上的工具栏图标着色

Android Bitmap着色

Android Tint着色与帧动画结合

Android:使用 DrawableCompat 进行着色

1062. 洪水填充(经典)