Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - Cut a circle from a square Bitmap

Tags:

android

I am trying to cut a circle from a square bitmap using following code

        Canvas canvas=new Canvas(bitmapimg );
        int circleXCoord = bitmapimg .getWidth() / 2;
        int circleYCoord = bitmapimg .getHeight() / 2;
        int circleRadius = bitmapimg .getWidth() / 2;

        Rect rect = new Rect(circleXCoord - circleRadius, circleYCoord - circleRadius, circleXCoord + circleRadius, circleYCoord + circleRadius);

        int width = rect.width();
        int height = rect.height();

        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.BLUE);
        canvas.drawRect(rect, paint);
        canvas.drawBitmap(bitmapimg , rect, rect, paint);
        Path p = new Path();
        p.addCircle(circleXCoord, circleYCoord, width / 2F, Path.Direction.CW);
        canvas.clipPath(p, Region.Op.DIFFERENCE);
        canvas.drawColor(0, PorterDuff.Mode.CLEAR);

The idea is to attach a square (rectangular) bitmap to canvas and then clip a circular path. Clear out the difference between the rectangle and circle (make it transparent).

The code works fine for Android 4, but on Android 2.3.3 device, the difference area is appearing black rather that transparent.

Am I missing something here or PorterDuff.Mode.CLEAR is not supported in gingerbread? Is there a better way to cut a circle from a square in Android?

like image 834
Kamal Avatar asked Nov 08 '12 09:11

Kamal


1 Answers

Seems like PorterDuff.Mode.Clear did not work for gingerbread

Solved the problem (cut circle from square using this code)

 public Bitmap BitmapCircularCroper(Bitmap bitmapimg){
    Bitmap output = Bitmap.createBitmap(bitmapimg.getWidth(),
            bitmapimg.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmapimg.getWidth(),
            bitmapimg.getHeight());

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawCircle(bitmapimg.getWidth() / 2,
            bitmapimg.getHeight() / 2, bitmapimg.getWidth() / 2, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmapimg, rect, rect, paint);
    return output;

}
like image 140
Kamal Avatar answered Sep 17 '22 11:09

Kamal