2

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

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

注意:第一个图像显示 - 裁剪矩形区域,然后使用其他一些功能以圆形方式显示它。
而图像二显示 - 以圆形裁剪图像。

在此处输入图像描述

在此处输入图像描述

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

我在 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 函数。

4

3 回答 3

5

由于不同的制造商为相机实现了自己的接口,所以下面的第一种方法并不适用于所有情况。例如,它在我的 Nexus S 上运行 stock 2.3.6 而不是我的 Galaxy Nexus 在 stock 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

这应该会启动默认的裁剪应用程序,如下所示: 圆形裁剪

如果您已阅读commonsware的这篇文章,您就会知道这并不总是有效。我建议包括他的帖子中的一个库。来自lvillani的第一个是 CropImage 活动提取的 AOSP。包含该库并以与上述类似的意图调用它。确保在意图中包含 circleCrop 参数。

于 2013-10-28T17:08:18.370 回答
4
    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 持有圆形图像。

于 2013-10-27T10:20:40.347 回答
0

我还没有尝试过,但它应该可以工作......

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

获取一个Canvas在新位图上绘制。创建一个Path对象并调用addCircle. 呼吁clipPath通过Canvas你的通告Path。现在将相机图像绘制到Canvas,它应该只在剪切区域内绘制。解锁Canvas并使用新Bitmap的来保存您想要的任何类型的图像。适当处置任何资源。

于 2013-10-27T10:14:43.543 回答