2016-07-11 38 views
4

我正在开发一个着色应用程序,并能够使用下面的代码填充不同颜色的图像的白色。
这里是Java类填充模式,而不是使用洪水填充algroithim的颜色android

import java.util.LinkedList; 
import java.util.Queue; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.BitmapFactory.Options; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Point; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 

public class Main extends Activity { 

private RelativeLayout dashBoard; 
private MyView myView; 
public ImageView image; 

Button b_red, b_blue, b_green, b_orange, b_clear; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    myView = new MyView(this); 
    setContentView(R.layout.activity_main); 
    findViewById(R.id.dashBoard); 

    b_red = (Button) findViewById(R.id.b_red); 
    b_blue = (Button) findViewById(R.id.b_blue); 
    b_green = (Button) findViewById(R.id.b_green); 
    b_orange = (Button) findViewById(R.id.b_orange); 

    b_red.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      myView.changePaintColor(0xFFFF0000); 
     } 
    }); 

    b_blue.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      myView.changePaintColor(0xFF0000FF); 
     } 
    }); 

    b_green.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      myView.changePaintColor(0xFF00FF00); 
     } 
    }); 

    b_orange.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      myView.changePaintColor(0xFFFF9900); 
     } 
    }); 

    dashBoard = (RelativeLayout) findViewById(R.id.dashBoard); 
    dashBoard.addView(myView); 

} 

public class MyView extends View { 

    private Paint paint; 
    private Path path; 
    public Bitmap mBitmap; 
    public ProgressDialog pd; 
    final Point p1 = new Point(); 
    public Canvas canvas; 

    //Bitmap mutableBitmap ; 
    public MyView(Context context) { 

     super(context); 

     this.paint = new Paint(); 
     this.paint.setAntiAlias(true); 
     pd = new ProgressDialog(context); 
     this.paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     paint.setStrokeWidth(5f); 
     mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.forme).copy(Bitmap.Config.ARGB_8888, true); 
     this.path = new Path(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     this.canvas = canvas; 
     this.paint.setColor(Color.RED); 

     canvas.drawBitmap(mBitmap, 0, 0, paint); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 

      case MotionEvent.ACTION_DOWN: 

       p1.x = (int) x; 
       p1.y = (int) y; 
       final int sourceColor = mBitmap.getPixel((int) x, (int) y); 
       final int targetColor = paint.getColor(); 
       new TheTask(mBitmap, p1, sourceColor, targetColor).execute(); 
       invalidate(); 
     } 
     return true; 
    } 

    public void clear() { 
     path.reset(); 
     invalidate(); 
    } 

    public int getCurrentPaintColor() { 
     return paint.getColor(); 
    } 

    public void changePaintColor(int color){ 
     this.paint.setColor(color); 
    } 

    class TheTask extends AsyncTask<Void, Integer, Void> { 

     Bitmap bmp; 
     Point pt; 
     int replacementColor, targetColor; 

     public TheTask(Bitmap bm, Point p, int sc, int tc) { 
      this.bmp = bm; 
      this.pt = p; 
      this.replacementColor = tc; 
      this.targetColor = sc; 
      pd.setMessage("Filling...."); 
      pd.show(); 
     } 

     @Override 
     protected void onPreExecute() { 
      pd.show(); 

     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 

     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      FloodFill f = new FloodFill(); 
      f.floodFill(bmp, pt, targetColor, replacementColor); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      pd.dismiss(); 
      invalidate(); 
     } 
    } 
} 

// flood fill 
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); 
     } 
    } 
} 
} 

正如你可以看到我用填充洪水算法对图像中的着色白色空间。
该图像是如下:
Image to be used to fill the color

现在问题是如何可以填充与下面图案(或任何其它图案)的白色空间区域,而不是颜色
Pattern image

请任何帮助表示赞赏,因为我是新来的机器人。 Thankyou

回答

3

好了一点小小的解决方法之后,我可以使用洪水填充算法填充封闭区域中的模式。以下是我所做的。
1.引入一个新的位图与模式,你可以看到下面。

bitmapPattern = BitmapFactory.decodeResource(getResources(),R.drawable.pattern1).copy(Bitmap.Config.ARGB_8888, true); 
  • 并通过此bitmapPattern洪水填充算法如下。

    FloodFillPattern f = new FloodFillPattern(); 
    f.floodFillPattern(bmp, pt, targetColor, replacementColor, pattern); 
    
  • 请注意,您必须缩放此位图,该位图等于您将填充此图案的图像大小。

  • 然后,只需在洪水填充算法中将原始图像的像素替换为模式位图的像素即可。具体如下:

    image.setPixel(x, y, pattern.getPixel(x,y)); 
    
  • 模式patternBitmap你通过。
    愿意帮助别人:)