Freehand Image Crop рисовать внутри растровой области

Пытаясь добиться обрезки изображения, я смогу нарисовать изображение. Но он выходит за пределы растрового региона. Я просто хочу ограничить, что пользователь может рисовать только внутри области растрового изображения, проверьте снимок экрана.

Я пытаюсь реализовать такие функции, как Photoshop lasso tool .

Его рисунок за пределами области обзора, который генерирует неправильный вывод. вход

Вывод Вывод

Код@

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

Предложите мне достичь своей цели.

Solutions Collecting From Web of "Freehand Image Crop рисовать внутри растровой области"

Существует один из способов достижения вашей цели.

Выполните следующие шаги:

1) Сделайте одно изображение, так как внутренняя часть изображения обрезки должна быть прозрачной, а внешняя часть должна быть фоном проверки холста под изображением.

2) Нарисуйте это изображение поверх своего холста.

3) Нарисуйте что-нибудь на своем холсте и нарисуйте это изображение поверх холста.

Образ:

Введите описание изображения здесь

Вы можете игнорировать все события касания, которые находятся за пределами вашего изображения. Помните о последнем месте события, которое находится внутри вашего изображения, и соедините его со следующей ячейкой события, которая находится внутри представления. Это должно работать, когда оба события являются частью одного движения (без поднятия пальца), но это может быть сложнее, когда рисунок выполняется за пределами вашего вида, а затем начинается новый чертеж. Попытайтесь осветить это дело.

Поздний ответ, но использовать полный для другого u можете переопределить метод onmeasure и установить ширину и высоту растрового изображения в этом методе и изменить размер вашего холста, так что теперь вы можете рисовать только в своем canvas.so ваше изображение попадает в 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, чтобы вы могли использовать его esaly.

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