Create a gist now

Instantly share code, notes, and snippets.

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";
}
}

Thank you!

Thank you, will you send a pull request back to Picasso project.

thank you

Very nice. Thanks!

Thanks! Спасибо!

thanks ,it's very helpful for me

hpadrao commented Apr 29, 2014

Awesome

Gorbas commented May 7, 2014

Great!!

Thanks!

Thank you!!!

works perfectly! Thank you!

gbero commented Jul 29, 2014

Nice thanks!!
If you're looking for just rounded corners here's a pretty decent solution : https://gist.github.com/aprock/6213395

and key needs to be unique

@Override
public String key() {
    return "circle(x=" + x + ",y=" + y + ")";
}

welshk91 commented Oct 9, 2014

This is great. I'm new to Transformations and am fiddling with this source code, trying to get a circular border around it. Any tips?

simply draw another circle, with a color

I have prepared a modified version of Julian' s Circle Transform to show a border around the circle image.

https://gist.github.com/berkkaraoglu/ab4caa8b1fe48231dec2

fazlurr commented Nov 20, 2014

Nice Work! Thanks 😄

Gruneau commented Jan 8, 2015

I get an exception whenever my app tries to load a .gif (the placeholder one from facebook) and run a circletransform (or blur)

Caused by: java.lang.NullPointerException: Attempt to read from field 'int android.graphics.Bitmap$Config.nativeInt' on a null object reference

Any ideas? Works lovely otherwise..

alxscms commented Jan 26, 2015

To get this script work with GIF files, replace line 42 by:

// GIF files generate null configs, assume ARGB_8888
Bitmap.Config config = source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = Bitmap.createBitmap(size, size, config);

Dis is awesome. Works like a charm. I have a rounded cornered transformer in one of my projects if you guys want to check out.

Awesome!

Actually, line 42 should be Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);

Otherwise this will show up a black background for image configured with other configurations

Thanks a lot! Works great!

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

not working properly in 2.3

Thanks alxscms, worked!

really cool

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

thnx!

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 commented Jan 24, 2016

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

Thank you!!!!!!

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 commented May 5, 2016

Thank you

Thank you that's perfect !

Nice.

Shujito commented Oct 7, 2016

I'll star it

Excellent .........

how used it in main ?

Thanks @alxscms for gif config help.

alexbbb13 commented Mar 22, 2017 edited

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

You saved my job, Thanks a lot man 👍

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

Thanke you.

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