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

Posted

技术标签:

【中文标题】需要圆形裁剪功能而不是矩形【英文标题】:Need circular cropping functionality instead of rectangular 【发布时间】:2013-10-06 01:56:10 【问题描述】:

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

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

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

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

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

【问题讨论】:

如果您有一个位图,其中的图像可以随意裁剪,您还想问什么?您希望作物发生在哪里? 为了更清楚,我编辑了这个问题。希望你能得到我想问的。 那么你想让内置的裁剪工具有不同的功能吗? 我们可以用这种技术实现透明背景吗? 【参考方案1】:

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

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 参数。

【讨论】:

谢谢哥们。这正是我需要的:)。这里为您 +50 分。 你能告诉我“Constants.PROFILE_PICTURE_SIZE”在intent.putExtra("outputX", Constants.PROFILE_PICTURE_SIZE);中的作用是什么 @User42 在我的项目中,该常量是一个值为 600(像素)的整数 你能看看这个问题吗? ***.com/questions/19699496/… @User42 刚刚发布了一个答案。希望这会有所帮助。【参考方案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 持有圆形图像。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于需要圆形裁剪功能而不是矩形的主要内容,如果未能解决你的问题,请参考以下文章

将矩形图片转化为圆形图片

如何裁剪轮廓的内部区域?

Flutter实现圆形头像的几种方法

在android中使用人脸检测裁剪图像

Windows phone 8.1 裁剪矩形

Android - 在 Android Pie (API 28) RadialGradient 绘制一个矩形而不是圆形