Tengo un mapa de bits y quiero recortar una región circular de este mapa de bits. Todos los píxeles fuera del círculo deben ser transparentes. ¿Cómo puedo hacer esto?
108
Tengo un mapa de bits y quiero recortar una región circular de este mapa de bits. Todos los píxeles fuera del círculo deben ser transparentes. ¿Cómo puedo hacer esto?
Después de una larga lluvia de ideas, he encontrado la solución.
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
y usarse en una clase de utilidad no instanciada de métodos estáticos similares.canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
para generar círculo a partir de rectángulos
fuente
Puede hacer que su vista de imagen sea circular usando RoundedBitmapDrawable
aquí está el código para lograr una vista de imagen redondeada:
fuente
@Gene hizo un comentario sobre la respuesta anterior que sugería usar
clipPath
como una opción para recortar una imagen como un círculo.La siguiente es una implementación limpia de esto:
Esto podría agregarse a una clase de utilidad.
fuente
c.drawBitmap(b, 0, 0, null);
, que usa la transformación de identidad predeterminada.Creo que esta solución funciona mejor con cualquier tipo de rectángulo, cambie el tamaño de píxel si desea una imagen pequeña o grande:
fuente
Esto también se puede hacer fácilmente en xml sin recortar el mapa de bits real. Solo necesita crear una máscara de imagen circular y colocarla sobre su imagen real. Aquí está el fragmento de código que utilicé:
circle.xml
your_layout.xml (Ignore "android: scaleType =" fitXY "" si no lo necesita)
dimen.xml
Vista de imagen de salida:
Espero, ¡podría ser útil para alguien! :)
fuente
puedes usar este código, funcionará
fuente
puedes usar este código, funcionará
fuente
Recomiendo agregar
bitmap.recycle()
si ya no lo necesita, evitará el error OutOfMemory.fuente
Aquí está la variante de Kotlin usando el método de extensión
fuente
Para las personas que quieren el centro del rectángulo (yo), agregue esto antes de cortar:
Centro de recorte de Android de mapa de bits
fuente
Basado en la respuesta de [Jachumbelechao Unto Mantekilla], este código funciona como un encanto para las personas que buscan una solución Kotlin:
fuente
Ahora, respuesta correcta:
fuente
Función de Kotin
llámalo por este código
fuente
Creo que la solución más fácil es crear un BitmapShader de su Bitmap, pasarlo a su objeto de pintura y luego simplemente llamar a algo como canvas.drawCircle (cx, cy, radius, paint);
por ejemplo
Así es como https://github.com/hdodenhof/CircleImageView también lo ha hecho, puedes leer el código fuente aquí: https://github.com/hdodenhof/CircleImageView/blob/master/circleimageview/src/main/java /de/hdodenhof/circleimageview/CircleImageView.java
fuente
fuente
No estoy seguro de que sea una pregunta de programación, pero ...
La solución más sencilla sería hacer que el área exterior sea transparente en el mapa de bits de origen. De lo contrario, tendrá que calcular qué píxeles están fuera del círculo y configurar el alfa en consecuencia (alfa = 0 para una transparencia total).
fuente