手绘图像裁剪在位图区域内绘制

时间:2013-06-21 06:58:44

标签: android bitmap android-canvas crop

尝试实现图像的徒手裁剪,这样我就可以在图像上绘图了。但它超出了位图区域。我只想限制用户只能在位图区域内绘制,检查下面的屏幕截图。

我正在尝试实现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));
        }
建议我实现自己的目标。

3 个答案:

答案 0 :(得分:1)

迟到的回答但是使用full可以覆盖其他你可以覆盖onmeasure方法并在该方法中设置你的图像位图宽度和高度并调整你的画布大小所以现在你只能在你的画布中绘制。所以你的图像来自center.it仅用于drawpath在你的位图上。

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

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

    setMeasuredDimension(width,height);
}

然后改变你的oncrop方法,这样你就可以解决它了。

Bitmap resultingImage = Bitmap.createBitmap(yourbitmap.getwidth(),yourbitmap.getheight(), yourbitmap.getConfig());

答案 1 :(得分:0)

有一种方法可以实现你的目标..

按照以下步骤操作:

1)使一个图像像裁剪图像的内部部分应该是透明的,外部部分应该是画布的背景检查图像。

2)在画布上绘制该图像。

3)在画布上绘制任何内容,并将该图像绘制在画布上。

图片:

enter image description here

答案 2 :(得分:0)

您可以忽略图片视图外的所有触摸事件。记住图像视图中的最后一个事件位置,并将其与视图内的下一个事件位置连接。当两个事件都是单个运动的一部分(不抬起手指)时,这应该有效,但是当在视图外部完成绘图然后在内部开始新绘图时,它可能会更复杂。尽量覆盖这个案例。