安卓:图片的自由裁剪

3
我想在图片上自由裁剪...自由裁剪 图片可以来自相册,也可以来自相机...是否有相关的解决方案?

你以前使用过 SurfaceView 吗? - kabuto178
@kabuto178 还没有... - Krunal Desai
1个回答

25
  • 从图库或相机加载图像到视图(使用Canvas绘制图像)

     public class SomeView extends View implements OnTouchListener {
        private Paint paint;
        public static List<Point> points;
        int DIST = 2;
        boolean flgPathDraw = true;
    Point mfirstpoint = null; boolean bfirstpoint = false;
    Point mlastpoint = null;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.gallery_12); Context mContext;
    public SomeView(Context c) { super(c);
    mContext = c; setFocusable(true); setFocusableInTouchMode(true);
    paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setStyle(Paint.Style.STROKE); paint.setPathEffect(new DashPathEffect(new float[] { 10, 20 }, 0)); paint.setStrokeWidth(5); paint.setColor(Color.WHITE);
    this.setOnTouchListener(this); points = new ArrayList<Point>();
    bfirstpoint = false; }
    public SomeView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; 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>(); bfirstpoint = false;
    }
    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 { mlastpoint = points.get(i); 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) {
    if (bfirstpoint) {
    if (comparepoint(mfirstpoint, point)) { // points.add(point); points.add(mfirstpoint); flgPathDraw = false; showcropdialog(); } else { points.add(point); } } else { points.add(point); }
    if (!(bfirstpoint)) {
    mfirstpoint = point; bfirstpoint = true; } }
    invalidate(); Log.e("Hi ==>", "Size: " + point.x + " " + point.y);
    if (event.getAction() == MotionEvent.ACTION_UP) { Log.d("Action up*******~~~~~~~>>>>", "called"); mlastpoint = point; if (flgPathDraw) { if (points.size() > 12) { if (!comparepoint(mfirstpoint, mlastpoint)) { flgPathDraw = false; points.add(mfirstpoint); showcropdialog(); } } } }
    return true; }
    private boolean comparepoint(Point first, Point current) { int left_range_x = (int) (current.x - 3); int left_range_y = (int) (current.y - 3);
    int right_range_x = (int) (current.x + 3); int right_range_y = (int) (current.y + 3);
    if ((left_range_x < first.x && first.x < right_range_x) && (left_range_y < first.y && first.y < right_range_y)) { if (points.size() < 10) { return false; } else { return true; } } else { return false; }
    }
    public void fillinPartofPath() { Point point = new Point(); point.x = points.get(0).x; point.y = points.get(0

2
我使用了这个方法,但是无法从裁剪区域获取位图。在保存时,它包含了背景和裁剪后的图像。 - Deepak Jangir
@noviceAndroid 你能告诉我如何从裁剪区域获取位图吗?以及如何在获取位图时避免图像周围的额外区域。 - Mustanser Iqbal
如果您想删除位图的额外部分,只需删除传输部分,这样您就可以获得原始裁剪图像。 - Kishan patel
@noviceAndroid 如何在onDraw中完成此操作,而不是在CropActivity中创建另一个位图 - http://stackoverflow.com/questions/36943983/android-crop-bitmap-canvas?noredirect=1#comment61446920_36943983。 - zek54
我想实现手动、方形、圆形和任意形状裁剪功能。那么你有完整库的参考资料吗? - Anand Savjani

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