Ich habe eine Bitmap und möchte aus dieser Bitmap einen kreisförmigen Bereich zuschneiden. Alle Pixel außerhalb des Kreises sollten transparent sein. Wie kann ich das machen?
108
Ich habe eine Bitmap und möchte aus dieser Bitmap einen kreisförmigen Bereich zuschneiden. Alle Pixel außerhalb des Kreises sollten transparent sein. Wie kann ich das machen?
Nach langem Brainstorming habe ich die Lösung gefunden
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
in einer nicht instanziierten Utility-Klasse ähnlicher statischer Methoden erstellt und verwendet werden.canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
Kreis aus Rechtecken erzeugen
quelle
Mit RoundedBitmapDrawable können Sie Ihre Bildansicht kreisförmig gestalten
Hier ist der Code zum Erreichen von roundImageview:
quelle
@Gene hat die obige Antwort kommentiert und vorgeschlagen,
clipPath
ein Bild als Kreis zuzuschneiden .Das Folgende ist eine saubere Implementierung davon:
Dies könnte einer Utility-Klasse hinzugefügt werden.
quelle
c.drawBitmap(b, 0, 0, null);
, welche die Standardidentitätstransformation verwendet.Ich denke, diese Lösung funktioniert besser mit jeder Art von Rechteck. Ändern Sie die Pixelgröße, wenn Sie ein kleines oder großes Bild wünschen:
quelle
Dies kann auch in XML problemlos durchgeführt werden, ohne dass die eigentliche Bitmap beschnitten wird. Sie müssen lediglich eine kreisförmige Bildmaske erstellen und über Ihrem tatsächlichen Bild platzieren. Hier ist der Code, den ich verwendet habe:
circle.xml
your_layout.xml (Ignoriere "android: scaleType =" fitXY "", wenn du es nicht brauchst)
dimen.xml
OutPut-Bildansicht:
Hoffe, es könnte für jemanden nützlich sein !!! :) :)
quelle
Sie können diesen Code verwenden, es wird funktionieren
quelle
Sie können diesen Code verwenden, es wird funktionieren
quelle
Ich empfehle das Hinzufügen,
bitmap.recycle()
wenn Sie es nicht mehr benötigen, es wird OutOfMemory-Fehler verhindern.quelle
Hier ist die Kotlin-Variante mit Erweiterungsmethode
quelle
Für Leute, die die Mitte des Rechtecks (mich) haben möchten, fügen Sie dies vor dem Schneiden hinzu:
Android Crop Center von Bitmap
quelle
Basierend auf der Antwort von [Jachumbelechao Unto Mantekilla] wirkt dieser Code wie ein Zauber für Leute, die nach einer Kotlin-Lösung suchen:
quelle
Nun, richtige Antwort:
quelle
Kotin Fucntion
Nennen Sie es mit diesem Code
quelle
Ich glaube, die einfachste Lösung besteht darin, einen BitmapShader Ihrer Bitmap zu erstellen, ihn an Ihr Malobjekt zu übergeben und dann einfach so etwas wie canvas.drawCircle (cx, cy, radius, paint) aufzurufen.
beispielsweise
So hat es auch https://github.com/hdodenhof/CircleImageView gemacht. Den Quellcode können Sie hier lesen: https://github.com/hdodenhof/CircleImageView/blob/master/circleimageview/src/main/java /de/hdodenhof/circleimageview/CircleImageView.java
quelle
quelle
Ich bin mir nicht sicher, ob dies eine Programmierfrage ist, aber ...
Die einfachste Lösung wäre, den Außenbereich in der Quellbitmap transparent zu machen. Andernfalls müssen Sie berechnen, welche Pixel außerhalb des Kreises liegen, und das Alpha entsprechend einstellen (Alpha = 0 für volle Transparenz).
quelle