J'ai un bitmap et je souhaite recadrer une région circulaire à partir de ce bitmap. Tous les pixels à l'extérieur du cercle doivent être transparents. Comment puis-je faire ceci?
108
J'ai un bitmap et je souhaite recadrer une région circulaire à partir de ce bitmap. Tous les pixels à l'extérieur du cercle doivent être transparents. Comment puis-je faire ceci?
Après un long brainstorming, j'ai trouvé la solution
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
et utilisée dans une classe d'utilité non instanciée de méthodes statiques similaires.canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
pour générer un cercle à partir de rectangles
la source
Vous pouvez rendre votre imageview circulaire en utilisant RoundedBitmapDrawable
voici le code pour obtenir une vue arrondie:
la source
@Gene a fait un commentaire sur la réponse ci-dessus suggérant de l'utiliser
clipPath
comme option pour recadrer une image en cercle.Ce qui suit est une mise en œuvre propre de ceci:
Cela pourrait être ajouté à une classe utilitaire.
la source
c.drawBitmap(b, 0, 0, null);
, qui utilise la transformation d'identité par défaut.Je pense que cette solution fonctionne mieux avec tout type de rectangle, changez la taille des pixels si vous voulez une image petite ou grande:
la source
Cela peut également être fait facilement en XML sans recadrer le bitmap réel.Il vous suffit de créer un masque d'image circulaire et de le placer sur votre image réelle. Voici le morceau de code que j'ai utilisé:
circle.xml
your_layout.xml (Ignorez "android: scaleType =" fitXY "" si vous n'en avez pas besoin)
dimen.xml
Vue d'image OutPut:
J'espère que cela pourrait être utile pour quelqu'un !!! :)
la source
vous pouvez utiliser ce code, cela fonctionnera
la source
vous pouvez utiliser ce code, cela fonctionnera
la source
Je recommande d'ajouter
bitmap.recycle()
si vous n'en avez plus besoin, cela évitera l'erreur OutOfMemory.la source
Voici la variante de Kotlin utilisant la méthode d'extension
la source
Pour les paons qui veulent le centre du rectangle (moi), ajoutez ceci avant de couper:
Centre de cultures Android de Bitmap
la source
Basé sur la réponse [Jachumbelechao Unto Mantekilla], ce code fonctionne comme un charme pour les personnes à la recherche d'une solution Kotlin:
la source
Maintenant, bonne réponse:
la source
Kotin Fucntion
appelez-le par ce code
la source
Je pense que la solution la plus simple est de créer un BitmapShader de votre Bitmap, de le passer à votre objet de peinture, puis d'appeler simplement quelque chose comme canvas.drawCircle (cx, cy, radius, paint);
par exemple
C'est ainsi que https://github.com/hdodenhof/CircleImageView l'a également fait, vous pouvez lire le code source ici: https://github.com/hdodenhof/CircleImageView/blob/master/circleimageview/src/main/java /de/hdodenhof/circleimageview/CircleImageView.java
la source
la source
Je ne suis pas sûr que ce soit une question de programmation mais ...
La solution la plus simple serait de rendre la zone extérieure transparente dans le bitmap source. Sinon, vous devrez calculer quels pixels sont en dehors du cercle et définir l'alpha en conséquence (alpha = 0 pour une transparence totale).
la source