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

10

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

我试图实现类似于Photoshop套索工具的功能。

它在视图区域外进行绘制,导致输出不正确。 输入

输出 输出

Code@

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个回答

2

虽然回答晚了,但对其他人有帮助。您可以重写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());

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

0

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

按照以下步骤:

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

2)将该图像绘制在画布的顶部。

3)在画布上绘制任何内容,并再次在画布的顶部绘制该图像。

图片:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接