我一直在网上搜索,但找不到任何帮助。
我想通过调用相机捕获图像并想要裁剪它。但事情是,而不是RECTANGULAR裁剪(图像中给出)工具我需要一个CIRCULAR(第二个图像)。
注意:首先显示的图像 - 裁剪矩形区域然后使用其他功能以圆形方式显示它 而图像二显示 - 圆形的裁剪图像。
我在网上找到的只是使用这个矩形工具进行裁剪,然后以圆形视图显示图像。 (但我想以圆形形式裁剪)
我在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函数。
答案 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
这应该启动默认裁剪应用程序,如下所示:
如果你已经通过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
来保存您想要的任何类型的图像。根据需要处置任何资源。