заливка заливкой на андроиде

я просто пытаюсь использовать класс 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, например: Color.RED и Color.GREEN, все будет работать нормально. Я могу заменить красный f.g на зеленый, это работает, но если я попытаюсь использовать собственный цвет, например: f.g. Color.rgb(34, 198, 67) я получаю цветную точку вместо заполненной формы.

Можете ли вы помочь мне найти решение этой проблемы?

Редактировать1:

Я заметил кое-что интересное. Пользовательские цвета кажутся разными значениями для некоторых пикселей, но я не знаю, почему, если я использую заливку.


person Paweł Marecki    schedule 28.04.2014    source источник
comment
не могли бы вы поделиться полной реализацией этого кода, мне это нужно для моего проекта, пожалуйста.   -  person Zia Ur Rahman    schedule 22.02.2018
comment
Привет @ZiaUrRahman, извини, но это невозможно. Этот код был написан для коммерческого продукта и принадлежит компании, в которой я работал. У меня больше нет доступа к этому проекту. Я надеюсь, что вы сможете найти способ заставить его работать в вашем проекте.   -  person Paweł Marecki    schedule 22.02.2018
comment
Спасибо за ваш ответ. Я не хочу давать полный проект, но просто хочу, чтобы вы просто использовали colorize() в MainActivity, я хочу посмотреть, как это работает (заполнить область, касаясь разных границ)... затем остальная часть моего проекта , я сделаю в соответствии с моим требованием. Надеюсь, вы поможете мне в этом отношении. Спасибо.   -  person Zia Ur Rahman    schedule 22.02.2018
comment
@ZiaUrRahman Честно говоря, я не могу вспомнить, как я использовал этот код, но я почти уверен, что нашел его здесь: Как использовать алгоритм заливки в Android? Есть кое-что о представлениях и действиях. Это будет уже года 3 как я не работаю на андроиде так что наверное многое изменится. Насколько я помню, этот код тестировался на андроиде 4.0.   -  person Paweł Marecki    schedule 23.02.2018


Ответы (1)


Проблема решена. Битмап, где я использовал заливку, был RGB_565. Я просто конвертирую его в ARGB_8888, и все работает нормально.

person Paweł Marecki    schedule 29.04.2014