2011-06-30 3 views
1

最近、私はペイントプロジェクトを手がけました。まず、私は 色を選択する必要があります。私が画像に触れると、選択された色は がビットマップ画像の同じ色領域に置き換えられます。どのように私は 画像内の同じ色領域の形を認識することができます。 アンドロイドのビットマップイメージからオブジェクトの形状を認識しますか?

敬具

ハビブ

答えて

1

このコードは、完全な

imageViewEdit.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     setColor = newbitmap.getPixel((int)event.getX(),(int)event.getY()); 
     replaceX=(int)event.getX(); 
     replaceY=(int)event.getY(); 

     setColor_R = (setColor & 0x00ff0000) >> 16; 
     setColor_G = (setColor & 0x0000ff00) >> 8; 
     setColor_B = setColor & 0x000000ff; 

     boolean[][] visited = new boolean[newbitmap.getWidth()][newbitmap.getHeight()]; 


     Queue<Pixel> pixel=new LinkedList<Pixel>(); 
     pixel.add(new Pixel(replaceX, replaceY)); 

     while(!pixel.isEmpty()){ 

      Pixel loc = pixel.remove(); 
      visited[loc._x][loc._y] = true; 

      putIfValid(loc._x+1,loc._y-1,pixel,visited); 
      putIfValid(loc._x+1,loc._y,pixel,visited); 
      putIfValid(loc._x+1,loc._y+1,pixel,visited); 
      putIfValid(loc._x-1,loc._y-1,pixel,visited); 
      putIfValid(loc._x-1,loc._y,pixel,visited); 
      putIfValid(loc._x-1,loc._y+1,pixel,visited); 
      putIfValid(loc._x,loc._y+1,pixel,visited); 
      putIfValid(loc._x,loc._y-1,pixel,visited); 
     } 
     imageViewEdit.setImageBitmap(newbitmap); 

     return false; 
    } 


    public void putIfValid(int x, int y, Queue<Pixel> pixel, boolean[][] visited) { 

      int colors=newbitmap.getPixel(x, y); 

      int current_R = (colors & 0x00ff0000) >> 16; 
      int current_G = (colors & 0x0000ff00) >> 8; 
      int current_B = colors & 0x000000ff; 

      if(((setColor_R-RGBThreshold<=current_R) && (setColor_R+RGBThreshold>=current_R)) 
       &&((setColor_G-RGBThreshold<=current_G)&&(setColor_G+RGBThreshold>=current_G)) 
       &&((setColor_B-RGBThreshold<=current_B)&& (setColor_B+RGBThreshold>=current_B)) 
       && valid(x,y,visited)){ 

       pixel.add(new Pixel(x,y)); 
       newbitmap.setPixel(x, y, getColor); 
       visited[x][y]=true; 
      } 
    } 

    private boolean valid(int x, int y, boolean[][] visited) { 

     return x >= 2 && x < (newbitmap.getWidth()-2)&& 
       y >= 2 && y < (newbitmap.getHeight()-2) && 
       !visited[x][y]; 
    } 
}); 


public static class Pixel { 
    final public int _x; 
    final public int _y; 
    public Pixel(int x,int y){ 
     _x=x; 
     _y=y; 
    } 
} 
+0

助けてくれてありがとう。 –

+0

フラッドフィルアルゴリズムの実装例はこちら[link](https://stackoverflow.com/a/44631207/4185770) –

0

おそらく、バケツツールの実装を探しています。 Thisは、一般的な解決方法を説明する記事です。

+0

あなたの与えられたアイデアを助けることができるとのリンクは私がやってみたかったではない、まさに問題と類似しています。私はFlood Fill Algorithmのようなアルゴリズムを探しています。誰もAndroidやjavaでFlood Fill Algorithmを実装できますか?私たちにあなたのアイデアをお伝えください。 –

関連する問題