Skip to content

Instantly share code, notes, and snippets.

Embed
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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.picassodemo;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.squareup.picasso.Transformation;
/**
* Created by julian on 13/6/21.
*/
public class CircleTransform implements Transformation {
@Override
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) {
source.recycle();
}
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);
paint.setShader(shader);
paint.setAntiAlias(true);
float r = size/2f;
canvas.drawCircle(r, r, r, paint);
squaredBitmap.recycle();
return bitmap;
}
@Override
public String key() {
return "circle";
}
}
@vuhung3990
Copy link

vuhung3990 commented May 28, 2015

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

@komalnikhare
Copy link

komalnikhare commented Jun 20, 2015

not working properly in 2.3

@heitorcolangelo
Copy link

heitorcolangelo commented Aug 19, 2015

Thanks alxscms, worked!

@EternalCoding
Copy link

EternalCoding commented Sep 2, 2015

really cool

@dtygel
Copy link

dtygel commented Oct 26, 2015

I've incorporated alxscms suggested change so that the script works with gif and other palletted bitmaps: https://gist.github.com/dtygel/71b77481ff9ddec26646

@oradkovsky
Copy link

oradkovsky commented Nov 8, 2015

thnx!

@mananwason
Copy link

mananwason commented Nov 12, 2015

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).

@ayushgp
Copy link

ayushgp commented Jan 24, 2016

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

@reenadeng
Copy link

reenadeng commented Apr 5, 2016

Thank you!!!!!!

@codezjx
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: https://gist.github.com/codezjx/b8a99374385a0210edb9192bced516a3

@jay915
Copy link

jay915 commented May 5, 2016

Thank you

@stephenrichard
Copy link

stephenrichard commented Jun 12, 2016

Thank you that's perfect !

@zionix357
Copy link

zionix357 commented Aug 6, 2016

Nice.

@Shujito
Copy link

Shujito commented Oct 7, 2016

I'll star it

@naveedshamim
Copy link

naveedshamim commented Nov 4, 2016

Excellent .........

@MohamaedGamal
Copy link

MohamaedGamal commented Feb 8, 2017

how used it in main ?

@Inn0vat0r
Copy link

Inn0vat0r commented Feb 16, 2017

Thanks @alxscms for gif config help.

@alexbbb13
Copy link

alexbbb13 commented Mar 22, 2017

Thanks @alexcms for GIF config
Exception: Attempt to read from field 'int android.graphics.Bitmap$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);

@shahalRahman
Copy link

shahalRahman commented Jun 1, 2017

You saved my job, Thanks a lot man 👍

@mvn-quocnguyen-dn
Copy link

mvn-quocnguyen-dn commented Jun 19, 2017

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

@pvthiendeveloper
Copy link

pvthiendeveloper commented Jun 22, 2017

Thanke you.

@hare451g
Copy link

hare451g commented Nov 8, 2017

thanks, hero

@emitchel
Copy link

emitchel commented Nov 15, 2017

Good stuff here, 👍

@lxww14
Copy link

lxww14 commented Dec 21, 2017

imageview has black backgound how change it to transparent

@flaviossantana
Copy link

flaviossantana commented Apr 18, 2018

Nice!

@nicola-coolshop
Copy link

nicola-coolshop commented Jun 25, 2018

Why it crop the image?

@G00fY2
Copy link

G00fY2 commented Oct 3, 2018

@robinkanatzar
Copy link

robinkanatzar commented Apr 9, 2019

Thank you!!!

@efanious
Copy link

efanious commented Aug 21, 2019

Cool!!!

@Maragues
Copy link

Maragues commented Apr 29, 2020

Thanks!

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