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

标签 android bitmap android-canvas crop

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

我正在尝试实现类似 Photoshop lasso tool 的功能.

它在 View 区域之外绘制,这会生成不正确的输出。 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));
        }

建议我实现我的目标。

最佳答案

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

 @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());

关于android - 手绘图像裁剪在位图区域内绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17229410/

相关文章:

java - RecyclerView fragment 不出现

android - Canvas 缩放转到点 (0,0)

android - 使用 canvas.scale 函数放大 Canvas ?

android - 如何使用抗锯齿有效地调整图像大小?

android - 更改箭头颜色 Material ExposedDropdownMenu/TextInputLayout

Android:使视频透明

android - 在 Android 上使用 NDK 的位图无限制堆内存库

c++ - 加载 bmp 文件到 HBITMAP

android - 如何在 TextView 中通过 unicode 设置表情符号?

android - 使用 esc/pos 热敏打印机 Android 打印真实的自定义尺寸位图