需要圆形裁剪功能而不是矩形
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
保存您想要的任何类型的图像。适当处置任何资源。
【讨论】:
以上是关于需要圆形裁剪功能而不是矩形的主要内容,如果未能解决你的问题,请参考以下文章