需要圆形裁剪功能而不是矩形

时间:2013-10-06 01:56:11

标签: android crop geometry

我一直在网上搜索,但找不到任何帮助。

我想通过调用相机捕获图像并想要裁剪它。但事情是,而不是RECTANGULAR裁剪(图像中给出)工具我需要一个CIRCULAR(第二个图像)。

注意:首先显示的图像 - 裁剪矩形区域然后使用其他功能以圆形方式显示它 而图像二显示 - 圆形的裁剪图像。

enter image description here

enter image description here

我在网上找到的只是使用这个矩形工具进行裁剪,然后以圆形视图显示图像。 (但我想以圆形形式裁剪)

我在onActivityResult函数中所做的是 -

             case CROP_FROM_CAMERA:         
                Bundle extras = data.getExtras();

                if (extras != null) 
                {               
                    Bitmap photo = extras.getParcelable("data");
                      //this method convert the rectangular cropped image to circular display.
                    GraphicsUtil gu= new GraphicsUtil();
                    Bitmap output = gu.getCircleBitmap(photo,16);
                    mImageView.setImageBitmap(output);

                  }

                File f = new File(mImageCaptureUri.getPath());
                if (f.exists()) f.delete();
                break;

GraphicsUtil函数的代码如下 -

public Bitmap getCircleBitmap(Bitmap bitmap, int pixels) {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xffff0000;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);

        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setFilterBitmap(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawOval(rectF, paint);

        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth((float) 4);
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
    }

所以你可以看到。图像被裁剪成矩形,然后传递给以圆形方式显示的函数  我想通过CROP_FROM_CAMERA意图循环裁剪图像,而不使用GraphicUtil函数。

3 个答案:

答案 0 :(得分:5)

由于不同的制造商为相机实现了自己的接口,下面的第一种方法并不适用于所有情况。例如,它运行在我的Nexus S运行库存2.3.6而不是我的Galaxy Nexus库存4.3。无论如何,如果您希望能够以默认裁剪操作以循环方式裁剪图像,请按以下方式调用它:

Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
intent.setData(imageUri); // Uri to the image you want to crop
intent.putExtra("outputX", Constants.PROFILE_PICTURE_SIZE);
intent.putExtra("outputY", Constants.PROFILE_PICTURE_SIZE);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("circleCrop", new String(""));
intent.putExtra("return-data", false);
File cropImageFile = new File(CROP_IMAGE_PATH); // Path to save the cropped image
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(cropImageFile));
startActivityForResult(intent, CROP); // CROP = Code to track the result in  onActivityResult

这应该启动默认裁剪应用程序,如下所示: Circular cropping

如果你已经通过commonsware阅读了这篇文章,那么你知道这并不总是有效。我建议在他的帖子中加入一个库。来自lvillani的第一个是CropImage活动提取的AOSP。包含库并使用与上面类似的意图调用它。确保在意图中包含circleCrop参数。

答案 1 :(得分:2)

    BitmapShader shader;
    shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,
            Shader.TileMode.CLAMP);

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShader(shader);

    RectF rect = new RectF(0.0f, 0.0f, width, height);

    Bitmap circularBitmap = Bitmap.createBitmap(width, height,
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(circularBitmap);

    canvas.drawArc(rect, 0, 360, true, paint);

现在,circularBitmap正在保持圆形图像。

答案 2 :(得分:0)

我还没有尝试过,但它应该有用......

我会假设你可以从相机中获取图像。获得该图像后,您可以按照以下步骤操作。

获取Canvas来绘制新的位图。创建Path对象并致电addCircle。通过clipPath通过您的通告Canvas致电Path。现在将相机图像绘制到Canvas,它应该只在剪切区域内绘制。解锁Canvas并使用新的Bitmap来保存您想要的任何类型的图像。根据需要处置任何资源。