Skip to content

Instantly share code, notes, and snippets.

Last active November 27, 2022 09:27
What would you like to do?
CircleTransform for Picasso
* Copyright 2014 Julian Shen
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* See the License for the specific language governing permissions and
* limitations under the License.
package com.example.picassodemo;
import com.squareup.picasso.Transformation;
* Created by julian on 13/6/21.
public class CircleTransform implements Transformation {
public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
if (squaredBitmap != source) {
Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
float r = size/2f;
canvas.drawCircle(r, r, r, paint);
return bitmap;
public String key() {
return "circle";
Copy link

thank you, but why it not work on android 2.3 (geanymotion)

Copy link

not working properly in 2.3

Copy link

Thanks alxscms, worked!

Copy link

really cool

Copy link

dtygel commented Oct 26, 2015

I've incorporated alxscms suggested change so that the script works with gif and other palletted bitmaps:

Copy link


Copy link

I get a Null pointer @julianshen. This is the stack Trace. Thanks for the help.
java.lang.NullPointerException: Transformation circle returned null after 0 previous transformation(s).

Copy link

ayushgp commented Jan 24, 2016

Finally after 3 hours of wasting my time on stackoverflow, I found this! Thanks a ton!

Copy link

Thank you!!!!!!

Copy link

codezjx commented May 4, 2016

We can use shader.setLocalMatrix() method to draw circle bitmap not from source bitmap left-top. So, there is no need to create square bitmap! You can find the optimized version here:

Copy link

Thank you

Copy link

Thank you that's perfect !

Copy link


Copy link

Shujito commented Oct 7, 2016

I'll star it

Copy link

Excellent .........

Copy link

how used it in main ?

Copy link

Thanks @alxscms for gif config help.

Copy link

alexbbb13 commented Mar 22, 2017

Thanks @alexcms for GIF config
Exception: Attempt to read from field 'int$Config.nativeInt' on a null object reference
Solution (As suggested by @alexcms) : Replace line 42 with

Bitmap.Config config = source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = Bitmap.createBitmap(size, size, config);

Copy link

You saved my job, Thanks a lot man 👍

Copy link

I need your help ! How can I custom Rounded ImageView depend radius !

Copy link

Thanke you.

Copy link

ghost commented Nov 8, 2017

thanks, hero

Copy link

Good stuff here, 👍

Copy link

lxww14 commented Dec 21, 2017

imageview has black backgound how change it to transparent

Copy link


Copy link

Why it crop the image?

Copy link

G00fY2 commented Oct 3, 2018

Copy link

Thank you!!!

Copy link


Copy link


On a huawei P10 Mate, applying this transformation is 5ms on average (in our case, ofc)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment