2013-06-21 14 views
8

フリーハンドクロッピングを実現しようとしているため、イメージを描画できます。しかし、それはビットマップ領域の外に出ます。私はちょうどそのユーザーがビットマップ領域内に描画することができます制限したい、スクリーンショットの下にチェックしてください。フリーハンドイメージビットマップ領域内にクロップ描画

Photoshop lasso toolのような機能を実装しようとしています。

不正な出力を生成する図面領域外の描画です。 Input

出力 Output

コード

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

私の目標を達成することを提案します。手順以下

答えて

0

あなたの目標を達成するための一つの方法があります。..

フォロー:

1)作物の画像のように内部の一部のような一枚の画像を透明にし、外側の一部であるべき作るの背景でなければなりませんキャンバスチェックの下に画像があります。

2)イメージをキャンバスの上に描画します。

3)キャンバスに何かを描き、キャンバスの上にイメージを描画します。

画像:

enter image description here

0

あなたのイメージ図の外側にあるすべてのタッチイベントを無視することができます。イメージビュー内にある最後のイベントの場所を覚えて、それをビュー内にある次のイベントの場所に接続します。これは、両方のイベントが単一の動作(指を離さずに)の一部である場合には機能しますが、図面がビューの外で実行された後に新しい図面が開始されるとさらに複雑になることがあります。この場合もカバーしてください。

0

最近の返信ですが、他の方法では完全に使用することができます。その方法でイメージのビットマップの幅と高さを設定し、キャンバスのサイズを変更してキャンバスに描画することができます。あなたのビットマップ上でのみ。

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

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

    setMeasuredDimension(width,height); 
} 

あなたのオンコロップ方法を変更して、それをスリルにすることができます。

Bitmap resultingImage = Bitmap.createBitmap(yourbitmap.getwidth(),yourbitmap.getheight(), yourbitmap.getConfig()); 
関連する問題