2012-01-10 2 views
13

Я хочу, чтобы заполнить цвет в белой области для краски на основе применения поэтому, пожалуйста, дайте мне предложение о том, как сделать эту работу ..Как заполнить цвет изображения в определенной области?

enter image description here

+5

Взгляните на классический алгоритм заполнения залива: http://en.wikipedia.org/wiki/Flood_fill – Jave

+0

Привет, Вот ссылка [1], чтобы получить точки изображения. означает только фактическую часть изображения и исключает прозрачную часть. но я не могу связать этот район. [1]: http://brownandroidattack.blogspot.com/2010/03/image-transparency-aka-absurd.html –

+1

спасибо Jave для информации заливка alogrithm –

ответ

17

Я нашел решение с Заливкой algoritham заливку

private void FloodFill(Bitmap bmp, Point pt, int targetColor, int replacementColor){ 
Queue<Point> q = new LinkedList<Point>(); 
q.add(pt); 
while (q.size() > 0) { 
    Point n = q.poll(); 
    if (bmp.getPixel(n.x, n.y) != targetColor) 
     continue; 

    Point w = n, e = new Point(n.x + 1, n.y); 
    while ((w.x > 0) && (bmp.getPixel(w.x, w.y) == targetColor)) { 
     bmp.setPixel(w.x, w.y, replacementColor); 
     if ((w.y > 0) && (bmp.getPixel(w.x, w.y - 1) == targetColor)) 
      q.add(new Point(w.x, w.y - 1)); 
     if ((w.y < bmp.getHeight() - 1) 
       && (bmp.getPixel(w.x, w.y + 1) == targetColor)) 
      q.add(new Point(w.x, w.y + 1)); 
     w.x--; 
    } 
    while ((e.x < bmp.getWidth() - 1) 
      && (bmp.getPixel(e.x, e.y) == targetColor)) { 
     bmp.setPixel(e.x, e.y, replacementColor); 

     if ((e.y > 0) && (bmp.getPixel(e.x, e.y - 1) == targetColor)) 
      q.add(new Point(e.x, e.y - 1)); 
     if ((e.y < bmp.getHeight() - 1) 
       && (bmp.getPixel(e.x, e.y + 1) == targetColor)) 
      q.add(new Point(e.x, e.y + 1)); 
     e.x++; 
    } 
}} 

наводнения в андроиде:

Посмотреть этот FloodFill

+0

Nice one Но если я просто добавлю этот алгоритм в Мое приложение для Android, если я вызову функцию FloodFill (с соответствующими атрибутами), тогда это будет работать? И что мне нужно дать в качестве атрибута Point в этой функции? –

+0

благодарит @ Хардик, это действительно хорошо написанный алгоритм. но для Android-телефона это кажется очень медленным. знаете ли вы какой-либо другой способ заполнения наводнений? –

+0

эта ссылка настолько быстра: http://stackoverflow.com/a/17426163/401403 – Arash

4

Вот быстрое приложение с помощью Python и OpenCV (должны быть доступны на Android, если вы попытаетесь достаточно трудно):

"""Flood fills with random color on click. Press `q' to exit.""" 
import cv 
import sys 
import random 

TOL = 10 
TOL_BGR = (TOL, TOL, TOL, 0) 

def click(event,x,y,flags,im): 
    if event == cv.CV_EVENT_LBUTTONDOWN: 
     b,g,r = [ random.random() * 255 for i in range(3) ] 
     cv.FloodFill(im, (x,y), (b,g,r,0), TOL_BGR, TOL_BGR) 

im = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) 
cv.NamedWindow(__file__, 1) 
cv.SetMouseCallback(__file__, click, im) 
while True: 
    cv.ShowImage(__file__, im) 
    key = cv.WaitKey(33) 
    if chr(key & 0xff) == 'q': 
     break 
cv.SaveImage('floodfill.png', im) 

Каждый раз, когда пользователь нажимает на изображение, приложение Flood-заливки, используя расположение в качестве затравки. Цвет выбирается случайным образом. Вы можете изменить допуски, изменив значение TOL (или TOL_BGR). Вот результат после того, как пару кликов:

enter image description here

Общий алгоритм такой же, независимо от того, какие технологии вы используете.

+0

не могли бы вы отправить исходный код, потому что я не мог понять эту часть – dineshprasanna

+0

Нет, я не буду посылать вам по электронной почте ваш код. Во всяком случае, исходный код в моем ответе. Если вы ничего не понимаете, пожалуйста, прочитайте документацию по соответствующим функциям - она ​​легко доступна. – misha

+0

ok не проблема, спасибо за ваш ответ, я попробую – dineshprasanna

0

1) Иметь дробить изображение для каждого цвета части отдельно с таким же размером поскольку фактическое изображение и другая часть являются прозрачными. 2) У вас есть полное изображение с каждой порцией в разных цветах в папке ur drawable - это всего лишь ссылочное изображение.

3) Добавьте все разделить изображения в макете кадра и установить все распалось невидимым изначально и установить видны реальное изображение только

4) Горячий код цвета для каждого разделить от ур эталонного изображения (step2) для Eg handSplitImageColor = зеленый;

4) Установить слушатель для компоновки кадра выяснить, х и у позиции и передать й и у позиции на уры опорного изображения (этап 2) и выяснить, цвет в этом конкретном месте и соответствовать цвету с шагом- и заполнить конкретное в этом изображении и установить видимость, истинную для этого разбитого изображения. Таким образом, только эта часть будет заполнена цветом, поскольку другая часть прозрачна.

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

Но я не думаю, что это лучшее решение, но оно хорошо работает для меня.

Смежные вопросы