2010-11-16 40 views
6

Tôi không thể tìm thấy triển khai thuật toán chèn lấp cho Android.Thuật toán Floodfill trong Android

Bất kỳ ý tưởng nào nếu API chèn lấp có sẵn trong Android và nếu không, có phương án nào khác không?

+0

Tôi không nghĩ rằng bạn có thể lấy mảng pixel từ bitmap và màu thay thế cho mình – schwiz

+0

Bạn đang nói về chỉnh sửa hình ảnh? Hoặc chỉ là một thuật toán chung cho một mảng đa chiều? –

+0

@alien bạn đã bao giờ tìm ra giải pháp cho điều này chưa? nếu có, bạn có nghĩ rằng bạn có thể cho tôi mã nguồn hoặc một ví dụ không? – Hades

Trả lời

2

Bạn có định nghĩa nào về hình dạng không?

Nếu có, hãy xem Canvas docs. Bạn có thể điền vào một vùng bằng cách xác định một vùng clip và sau đó gọi canvas.drawColor.

dụ Rough:

Rect r = new Rect(0,0,300,300); 
    canvas.clipRect(r); // see also clipRegion 
    canvas.drawColor(Color.RED); 

Có một số chức năng clip, vì vậy bạn sẽ có thể xây dựng bất cứ điều gì bạn đang cố gắng để lấp đầy.

Mặt khác, nếu bạn muốn chèn lấp một vùng trong một bitmap đã tải, thì tôi không biết.

2

floodfill trong android

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

Bạn nên sử dụng một AsyncTask sử dụng các thuật toán floodfill. Sử dụng cùng một chủ đề chính gây ra lỗi bộ nhớ. Ngay cả khi tôi sử dụng thuật toán floofill đôi khi làm đầy một khu vực rộng lớn mất nhiều thời gian hơn khiến ứng dụng trở nên không hồi đáp vào thời điểm đó.

Fill the complete canvas but keep the bound fill area as it is like circle, rectangle. Liên kết này có thể giải quyết vấn đề của bạn

+0

Wow làm việc tốt ..... 1 cho câu trả lời tuyệt vời –