1

如何在 Surface 视图中的图像上实现洪水填充算法?我已经在 Activity 中成功使用了这个算法。//这是我的课程,我尝试在图像的特定区域填充颜色 public class DrawCanvas extends SurfaceView implements Callback {

Bean bean;
Draw d;

String tag;
private Paint paint;
private Path path;

Bitmap mBitmap;
ProgressDialog pd;
 final Point p1 = new Point();
Canvas canvas;
private static final float TOUCH_TOLERANCE = 4;
float mX,mY;



public DrawCanvas(Context context) 
{
    super(context);

}

 public DrawCanvas(Context context, AttributeSet attrs)
    {
        super(context, attrs);    

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

            this.path = new Path();

            getHolder().addCallback(this);     
            setFocusable(true);                     

}


    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    {


    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) 
    {


            try 
            {
                canvas = holder.lockCanvas(null);
                synchronized (holder) 
                {
                    onDraw(canvas);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            } finally 
            {
                if (canvas != null) 
                {
                    holder.unlockCanvasAndPost(canvas);
                }
            }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) 
    {


    }
     @Override
        public void onDraw(Canvas canvas) 
     {            
        //super.onDraw(canvas);
        this.canvas=canvas;      

         mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.c);
         this.paint.setColor(Color.GREEN);
         canvas.drawBitmap(mBitmap, 0, 0,paint);
        }

     @Override
        public boolean onTouchEvent(MotionEvent event)
     {  System.out.println("touch");

            float x = event.getX();
            float y = event.getY();
            switch(event.getAction())
            {
            case MotionEvent.ACTION_DOWN:
            //final Point p1 = new Point();
            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();
        }
        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();
            }
            protected void onPreExecute() {
                pd.show();

            }

            protected void onProgressUpdate(Integer... values) {

            }

            protected Void doInBackground(Void... params) 
            {
                System.out.println("in flood fill");
                FloodFill f= new FloodFill();
                f.floodFill(bmp,pt,targetColor,replacementColor);
                return null;
            }

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

         public class FloodFill 
         {

             public void floodFill(Bitmap image, Point node, int targetColor,int replacementColor)
             {  System.out.println("in class floodfill");
                 int width = image.getWidth();
                 int height = image.getHeight();
                 int target = targetColor;
                 int replacement = replacementColor;

                 System.out.println("target color"+targetColor+"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);
                 }
             }
             }
}
4

0 回答 0