Eu tenho um bitmap e quero cortar uma região circular desse bitmap. Todos os pixels fora do círculo devem ser transparentes. Como posso fazer isso?
108
Eu tenho um bitmap e quero cortar uma região circular desse bitmap. Todos os pixels fora do círculo devem ser transparentes. Como posso fazer isso?
Após um longo brainstorming, encontrei a solução
public Bitmap getCroppedBitmap(Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
// canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
bitmap.getWidth() / 2, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
//Bitmap _bmp = Bitmap.createScaledBitmap(output, 60, 60, false);
//return _bmp;
return output;
}
static
e usado em uma classe de utilitário não instanciada de métodos estáticos semelhantes.canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
para gerar um círculo a partir de retângulos
fonte
Você pode tornar sua visualização de imagem circular usando RoundedBitmapDrawable
aqui está o código para obter roundedImageview:
fonte
@Gene fez um comentário sobre a resposta acima que sugeria o uso
clipPath
como opção para recortar uma imagem como um círculo.O seguinte é uma implementação limpa disso:
Isso pode ser adicionado a uma classe de utilitário.
fonte
c.drawBitmap(b, 0, 0, null);
, que usa a transformação de identidade padrão.Acho que essa solução funciona melhor com qualquer tipo de retângulo, mude o tamanho do pixel se quiser uma imagem pequena ou grande:
fonte
Isso pode ser feito facilmente em xml, sem cortar o bitmap real. Você só precisa criar uma máscara de imagem circular e colocá-la sobre a imagem real. Aqui está o trecho de código que usei:
circle.xml
your_layout.xml (Ignore "android: scaleType =" fitXY "" se não precisar dele)
dimen.xml
Visualização da imagem de saída:
Espero, pode ser útil para alguém !!! :)
fonte
você pode usar este código, vai funcionar
fonte
você pode usar este código, vai funcionar
fonte
Eu recomendo adicionar,
bitmap.recycle()
se você não precisar mais, evitará o erro OutOfMemory.fonte
Aqui está a variante do Kotlin usando o método de extensão
fonte
Para pessoas que desejam o centro do retângulo (eu), adicione isto antes de cortar:
Android Crop Center of Bitmap
fonte
Com base na resposta [Jachumbelechao Unto Mantekilla], este código funciona como um encanto para quem procura uma solução Kotlin:
fonte
Agora, resposta certa:
fonte
Kotin Fucntion
chame-o por este código
fonte
Eu acredito que a solução mais fácil é criar um BitmapShader do seu Bitmap, passá-lo para o seu objeto de pintura e então simplesmente chamar algo como canvas.drawCircle (cx, cy, radius, paint);
por exemplo
É assim que https://github.com/hdodenhof/CircleImageView também fez, você pode ler o código-fonte aqui: https://github.com/hdodenhof/CircleImageView/blob/master/circleimageview/src/main/java /de/hdodenhof/circleimageview/CircleImageView.java
fonte
fonte
Não tenho certeza se esta é uma questão de programação, mas ...
A solução mais fácil seria tornar a área externa transparente no bitmap de origem. Caso contrário, você terá que calcular quais pixels estão fora do círculo e definir o alfa de acordo (alfa = 0 para transparência total).
fonte