2012-01-10 11 views
13

Quiero llenar el color en el área blanca para su aplicación pintura a base así que por favor dame sugerencia de cómo hacer este trabajo ..cómo llenar el color de la imagen en un área determinada?

enter image description here

+5

eche un vistazo al clásico algoritmo de relleno de inundación: http://en.wikipedia.org/wiki/Flood_fill – Jave

+0

Hola, Aquí está el [enlace] [1] para obtener los puntos de la imagen. significa solo la parte real de la imagen y elimina la parte transparente. pero no puedo atar el área. [1]: http://brownandroidattack.blogspot.com/2010/03/image-transparency-aka-absurd.html –

+1

Muchas gracias Jave para obtener información de alogrithm FloodFill –

Respuesta

17

he encontrado la solución con Rellenar algoritham relleno

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++; 
    } 
}} 

inundación en android:

Ver esta imagen FloodFill

+0

Bueno, pero si acabo de agregar este algoritmo a Mi aplicación de Android si llamo a la función FloodFill (con los atributos respectivos), ¿funcionará? ¿Y qué debería dar como atributo de punto en esta función? –

+0

gracias @Hardik, es realmente un algoritmo muy bien escrito. pero para el teléfono Android parece ser muy lento. ¿Conoces alguna otra forma de llenar inundaciones? –

+0

este enlace es más rápido: http://stackoverflow.com/a/17426163/401403 – Arash

4

Aquí es una aplicación rápida utilizando Python y OpenCV (deben estar disponibles en Android, si se esfuerza lo suficiente):

"""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) 

Cada vez que el usuario hace clic en una imagen, las aplicaciones de iluminación con rellenos utilizando la localización clic como una semilla. El color se elige al azar. Puede cambiar las tolerancias modificando el valor de TOL (o TOL_BGR). Aquí está el resultado después de un par de clicks:

enter image description here

El algoritmo general es la misma, independientemente de lo que la tecnología que utiliza.

+0

podría enviar el código fuente, porque no puedo entender esta parte – dineshprasanna

+0

No, no le enviaré un correo electrónico con el código. El código fuente está en mi respuesta, de todos modos. Si no entiende nada, lea la documentación de las funciones relevantes, ya está disponible. – misha

+0

ok no hay problema, gracias por su respuesta, intentaré – dineshprasanna

0

1) Tener la división para cada porción del color por separado con el mismo tamaño ya que la imagen real y otra parte son transparentes. 2) Tenga la imagen completa con cada parte pintando en diferentes colores en su carpeta dibujable: esta es solo una imagen de referencia.

3) Añadir todas las imágenes se separó en el diseño de marcos y establecer todos los separaron invisible inicialmente y ajuste visibles a imagen real sólo se

4) de código caliente del color para cada divide ur imagen de referencia (paso 2) a partir de por ejemplo, handSplitImageColor = verde;

4) Establezca el oyente para el diseño del marco. Encuentre la posición xey y pase la posición xey a su imagen de referencia (paso 2) y descubra el color en esa ubicación particular y haga coincidir el color con el paso 4 y complete el particular en esa imagen y establezca la visibilidad verdadera para esa imagen dividida. Entonces, solo esa porción se llenará por color, ya que otras partes son transparentes.

Estos son los pasos que utilicé para uno de mis problemas del mismo tipo.

Pero no creo que esta sea la mejor solución pero funciona bien para mí.

Cuestiones relacionadas