2013-06-21 14 views
8

Próbujesz uzyskać odręczne przycinanie obrazu, dzięki czemu mogę rysować na obrazie. Ale wykracza poza region bitmapowy. Chcę tylko ograniczyć, aby użytkownik mógł rysować tylko w obszarze bitmap, sprawdź poniższy zrzut ekranu.Odręczny obraz Przyciągnij obszar wewnątrz mapy bitowej

Próbuję wdrożyć funkcjonalność, taką jak Photoshop lasso tool.

Jego rysunek poza region regionu, który generuje niepoprawne dane wyjściowe. Input

Wyjście Output

Kod @

OnDraw

public void onDraw(Canvas canvas) { 

     final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
     canvas.drawBitmap(bitmap, rect, rect, null); 
     // RectF r = new RectF(); 
     // Matrix matrix = new Matrix(); 
     // matrix.mapRect(r); 
     // Log.i(TAG, "Rect " + r.left + " " + r.top + " " + r.right + " " + 
     // r.bottom + " "); 
     // canvas.clipRect(r.left, r.top, r.right, r.bottom); 

     Path path = new Path(); 
     boolean first = true; 

     for (int i = 0; i < points.size(); i += 2) { 
      Point point = points.get(i); 
      if (first) { 
       first = false; 
       path.moveTo(point.x, point.y); 
      } else if (i < points.size() - 1) { 
       Point next = points.get(i + 1); 
       path.quadTo(point.x, point.y, next.x, next.y); 
      } else { 
       mlastpoint = points.get(i); 
       path.lineTo(point.x, point.y); 
      } 
     } 
     canvas.drawPath(path, paint); 
    } 

onCrop

Bitmap resultingImage = Bitmap.createBitmap(widthOfscreen,heightOfScreen, bitmap1.getConfig()); 

     Canvas canvas = new Canvas(resultingImage); 

     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     Path path = new Path(); 
     for (int i = 0; i < SomeView.points.size(); i++) { 
      path.lineTo(SomeView.points.get(i).x, SomeView.points.get(i).y); 
     } 
     // path.lineTo(150, 0); 
     // path.lineTo(230, 120); 
     // path.lineTo(70, 120); 
     // path.lineTo(150, 0); 

     canvas.drawPath(path, paint); 
     if(crop){ 
      paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 

     }else{ 
      paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); 
     } 

sugerują, żebym osiągnął mój cel.

Odpowiedz

0

Jest tylko jedna droga, aby osiągnąć swój cel ..

wykonaj poniższe czynności:

1) Dodać jeden obraz jak w wewnętrznej części upraw obrazu powinny być przejrzyste i poza częścią powinno być tło sprawdź obszar pod obrazem.

2) Narysuj ten obraz na górze płótna.

3) Narysuj cokolwiek na swoim płótnie i narysuj obrazek na górze płótna.

Obrazek:

enter image description here

0

Można zignorować wszystkie zdarzenia dotykowe, które są poza widzenia obrazu. Zapamiętaj ostatnią lokalizację wydarzenia w widoku obrazu i połącz ją z następną lokalizacją wydarzenia, która znajduje się w widoku. Powinno to działać, gdy oba zdarzenia są częścią jednego ruchu (bez podnoszenia palca), ale może to być bardziej skomplikowane, gdy rysunek jest wykonywany poza twoim widokiem, a następnie zaczyna się nowy rysunek. Spróbuj również omówić tę sprawę.

0

późna odpowiedź, ale użyj pełnej dla innych, możesz przesłonić metodę onmeasure i ustawić szerokość i wysokość bitmapy obrazu w tej metodzie i zmienić rozmiar płótna, aby teraz można było narysować tylko w swoim canvas.to obraz się center.it dla drawpath tylko na twojej mapie bitowej.

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    height = bitmap.getHeight(); 
    width = bitmap.getWidth(); 

    setMeasuredDimension(width,height); 
} 

, a następnie zmień swoją metodę onplowania, abyś mógł ją uszlachetnić.

Bitmap resultingImage = Bitmap.createBitmap(yourbitmap.getwidth(),yourbitmap.getheight(), yourbitmap.getConfig()); 
Powiązane problemy