在android中实现手绘裁剪
Posted
技术标签:
【中文标题】在android中实现手绘裁剪【英文标题】:implemanting freehand crop in android 【发布时间】:2012-10-03 09:33:12 【问题描述】:我正在尝试使用画布在 android 中实现徒手裁剪。我使用drawPath
并将其存储在List 中并在画布路径中绘制好,
喜欢这个
但现在我想用这段代码在侧面区域的那个路径中制作所有像素,但我不知道该怎么做..
public Bitmap getBitmapWithTransparentBG(Bitmap srcBitmap)
Bitmap result = srcBitmap.copy(Bitmap.Config.ARGB_8888, true);
int nWidth = result.getWidth();
int nHeight = result.getHeight();
for (int y = 0; y < nHeight; ++y)
for (int x = 0; x < nWidth; ++x)
for (int i = 0; i < points.size() ; i++)
result.setPixel(x, y, Color.TRANSPARENT);
return result;
points 是路径坐标列表 听到的是绘制路径的代码
package com.org;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class SomeView extends View implements OnTouchListener
private Paint paint;
List<Point> points;
int DIST = 2;
boolean flgPathDraw = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.waterlilies);
public SomeView(Context c )
super(c);
setFocusable(true);
setFocusableInTouchMode(true);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
paint.setColor(Color.WHITE);
this.setOnTouchListener(this);
points = new ArrayList<Point>();
public SomeView(Context context, AttributeSet attrs)
super(context, attrs);
setFocusable(true);
setFocusableInTouchMode(true);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
paint.setColor(Color.WHITE);
this.setOnTouchListener(this);
points = new ArrayList<Point>();
public void onDraw(Canvas canvas)
canvas.drawBitmap(bitmap, 0, 0, null);
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
path.lineTo(point.x, point.y);
canvas.drawPath(path, paint);
public boolean onTouch(View view, MotionEvent event)
// if(event.getAction() != MotionEvent.ACTION_DOWN)
// return super.onTouchEvent(event);
Point point = new Point();
point.x = (int) event.getX();
point.y = (int) event.getY();
if (flgPathDraw)
points.add(point);
invalidate();
Log.e("Hi ==>", "Size: " + points.size());
return true;
public void fillinPartofPath()
Point point = new Point();
point.x = points.get(0).x;
point.y = points.get(0).y;
points.add(point);
invalidate();
public void resetView()
points.clear();
paint.setColor(Color.WHITE);
paint.setStyle(Style.STROKE);
flgPathDraw=true;
invalidate();
class Point
public float dy;
public float dx;
float x, y;
@Override
public String toString()
return x + ", " + y;
【问题讨论】:
不,你不知道吗? 【参考方案1】:您好,我认为下面的链接是您的确切解决方案,您尝试什么?
Android: Free Croping of Image
不要忘记在此处投出您的投票和反馈。
【讨论】:
【参考方案2】:让我们看一个更复杂的例子:
红点是您要测试的点。您必须找到穿过红点 y 坐标的边缘。在本例中,有 4 条边穿过 y 坐标(蓝色点)。
现在测试在要检查的点的左侧和右侧有多少交叉点。如果两侧有奇数个交叉点,则该点位于形状内。
更新:你可以找到这个算法更详细的描述here
【讨论】:
【参考方案3】:您可以使用Canvas.clipPath 仅绘制裁剪区域。但请注意,此方法不适用于硬件加速,因此您必须 turn it off 并使用软件渲染。
【讨论】:
以上是关于在android中实现手绘裁剪的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 中实现类似于 Android 手机(默认)的裁剪功能?