Как обработать изображение для приложения-раскраски для Android?

У меня есть идея для приложения в виде книжки-раскраски для устройств Android.

Однако у меня нет опыта фактической обработки изображений, чтобы я мог их раскрасить. Я боюсь, что мой вопрос может быть слишком расплывчатым, но это лучшее, что я могу сделать с моим опытом, поэтому, пожалуйста, будьте терпеливы, если вы попытаетесь ответить (:

Вот мой вопрос. На данный момент я не собираюсь использовать какой-либо движок на основе спрайтов, так как у меня нет средств платить за те, с которыми я знаю, как работать. Так что мне остается использовать базовую платформу Android.

Результат, который я ищу, имеет такое изображение:

Мандала

И попросите пользователя приложения выбрать цвет и заполнить пробелы.

Я могу управлять пользовательским интерфейсом и программировать другие части приложения, однако я ВООБЩЕ НЕ ПОНИМАЮ, как обрабатывать такое изображение, чтобы приложение могло распознавать пробелы как сегменты и получать возможность окрашивать их.

Если вам нужна дополнительная информация по моему вопросу, пожалуйста, спросите!

Заранее спасибо, о славное сообщество stackoverflow ‹3


person batanasov    schedule 10.08.2015    source источник


Ответы (3)


Этот вопрос слишком широк для переполнения стека и, вероятно, будет закрыт, но, как всегда, вы должны разбить свою проблему на более мелкие части.

Шаг 1: Обработайте изображение, чтобы оно содержало только черно-белые изображения. Изображение, которое вы разместили, теперь содержит «не совсем белые» артефакты, которые усложнят его заполнение, поэтому избавьтесь от них.

Шаг 2: Определите, куда нажимает пользователь. Когда пользователь нажимает, вам нужно знать позицию на изображении этого клика.

Шаг 3: Начиная с этой точки, заполните (белую) область вокруг нее. Google — ваш друг, но лучше всего начать с алгоритма заполнения.

Шаг 4: Выведите изображение.

Вы можете разбить любой из этих шагов на еще более мелкие шаги. Когда вы застряли на определенном шаге, вы можете опубликовать MCVE, показывающий, что вы пробовали, и это будет проще чтобы помочь вам.

person Kevin Workman    schedule 10.08.2015
comment
Надеюсь не закроют, буду обновлять по мере прояснения в голове. Изображение, которое я разместил, является просто примером. На самом деле я буду рисовать свои в векторах, чтобы не было никаких артефактов. Как бы мне ни хотелось верить, что у меня есть некоторый опыт программирования, я никогда не слышал и не думал об алгоритме заливки. Вы упомянули, что это очень помогает мне. Спасибо, Кевин! - person batanasov; 10.08.2015
comment
@NoodlesFromHell Нет проблем. Обратите внимание, что формат Stack Overflow на самом деле не позволяет вам обновлять этот вопрос и получать больше ответов по мере развития вашей проблемы. Вместо этого старайтесь, чтобы ваши вопросы были небольшими и автономными: просто публикуйте новый вопрос, когда у вас есть более конкретная проблема, вместо того, чтобы обновлять этот вопрос новой информацией. - person Kevin Workman; 10.08.2015

Вы можете сделать следующее:

  1. Получить экземпляр bitmap для изображения
    Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
  2. Когда пользователь касается экрана, он получает x,y точки касания относительно изображения
  3. Используйте алгоритм заливки заливкой, чтобы заполнить белую область https://en.wikipedia.org/wiki/Flood_fill
  4. Чтобы получить пиксель в позиции (x,y), используйте:

    myBitmap.getPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight());

  5. Чтобы изменить значение пикселя в позиции (x,y), используйте: myBitmap.setPixel(x, y, Color.rgb(255, 255, 0));
person Mahmoud    schedule 10.08.2015
comment
Спасибо Махмуд. Теперь я в основном понимаю процесс сейчас. Идея алгоритма заполнения заливки была тем, чего мне не хватало. - person batanasov; 10.08.2015

Проверьте эту ссылку: Алгоритм заливки Android

Используйте QuickLinearFloodFilellr, чтобы заполнить белые области.

Нравится:

QueueLinearFloodFiller f = new QueueLinearFloodFiller(mBitmap,clr_int,mPaint.getColor());
            f.setFillColor(mPaint.getColor());
            f.setTargetColor(clr_int);
            f.setTolerance(10);
            f.floodFill(p1.x,p1.y); //fill bitmap, at p1 with p1's color and fill with Color from Switch
person Tristan G    schedule 04.01.2016