Daniel Mashraki
Daniel Mashraki

Reputation: 262

How to cut a circle from a different shapes of bitmap in android

How can i cut a circle from a different shapes of bitmap in android.

I tried this code, but some images are stretched:

    public Bitmap getRoundedShape(Bitmap scaleBitmapImage) {
    int targetWidth = 240;
    int targetHeight = 200;
    Bitmap targetBitmap = Bitmap.createBitmap(targetWidth,
            targetHeight,Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(targetBitmap);
    Path path = new Path();
    path.addCircle(((float) targetWidth - 1) / 2,
            ((float) targetHeight - 1) / 2,
            (Math.min(((float) targetWidth),
                    ((float) targetHeight)) / 2),
            Path.Direction.CCW);

    canvas.clipPath(path);
    Bitmap sourceBitmap = scaleBitmapImage;
    canvas.drawBitmap(sourceBitmap,new Rect(0, 0, sourceBitmap.getWidth(),
                    sourceBitmap.getHeight()),
            new Rect(0, 0, targetWidth, targetHeight), null);
    return targetBitmap;
}

Upvotes: 2

Views: 583

Answers (2)

Dorukhan Arslan
Dorukhan Arslan

Reputation: 2754

If you want a circular cut of an image, you need to find the largest square that centers the image. Considering this, following line fixes your stretching problem:

Bitmap bitmap = ThumbnailUtils.extractThumbnail(bitmap, radius, radius, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);

This method creates a circular cut of the target bitmap:

private Bitmap getCircularBitmap(int radius, Bitmap bitmap) {
    Bitmap.Config conf = Bitmap.Config.ARGB_8888;
    Bitmap bmp = Bitmap.createBitmap(radius, radius, conf);
    Canvas canvas = new Canvas(bmp);

    // creates a centered bitmap of the desired size
    bitmap = ThumbnailUtils.extractThumbnail(bitmap, radius, radius, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
    BitmapShader 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, 0, radius, radius);
    canvas.drawRoundRect(rect, radius, radius, paint);

    return bmp;
}

Upvotes: 1

kris larson
kris larson

Reputation: 31015

One approach would be to use a BitmapShader.

The idea is to use a Paint with a BitmapShader to draw a texture using the bitmap. Then you just draw a circle on the canvas.

Here is an excellent example of using the BitmapShader. In this example, a rectangle with rounded corners is drawn, but it could just as easily be a circle.

Android Recipe #1, image with rounded corners

Upvotes: 0

Related Questions