9

试图实现图像的徒手裁剪,所以我能够在图像上绘图。但它超出了位图区域。我只是想限制用户只能在位图区域内绘制,请查看下面的屏幕截图。

我正在尝试实现Photoshop 套索工具之类的功能。

它在视图区域之外绘制,这会产生不正确的输出。 输入

输出 输出

代码@

绘制

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

建议我实现我的目标。

4

3 回答 3

2

迟到的答案,但对其他人使用 full 你可以覆盖 onmeasure 方法并在该方法中设置图像位图的宽度和高度并调整画布的大小,所以现在你只能在画布中绘制。所以你的图像来中心。它仅用于你的位图上的绘制路径.

 @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());
于 2016-04-05T10:45:10.177 回答
0

您可以忽略图像视图之外的所有触摸事件。记住图像视图内的最后一个事件位置,并将其与视图内的下一个事件位置连接起来。当两个事件都是单个运动的一部分时(无需抬起手指),这应该可以工作,但是当在您的视图之外完成绘图然后在内部开始新的绘图时,它可能会更复杂。也尝试涵盖这种情况。

于 2013-09-24T12:14:32.137 回答
0

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

请按照以下步骤操作:

1)制作一张图像,如裁剪图像的内部部分应该是透明的,外部部分应该是图像下方的画布背景。

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

3)在画布上绘制任何东西,然后在画布上再次绘制该图像。

图片:

在此处输入图像描述

于 2013-06-21T07:48:28.030 回答