Mam mapę bitową i chcę wyciąć z niej obszar kołowy. Wszystkie piksele poza okręgiem powinny być przezroczyste. W jaki sposób mogę to zrobić?
108
Mam mapę bitową i chcę wyciąć z niej obszar kołowy. Wszystkie piksele poza okręgiem powinny być przezroczyste. W jaki sposób mogę to zrobić?
Po długiej burzy mózgów znalazłem rozwiązanie
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
i użyta w klasach narzędziowych, które nie są tworzone na podstawie podobnych metod statycznych.canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
aby wygenerować okrąg z prostokątów
źródło
Możesz ustawić okrągły widok obrazu za pomocą RoundedBitmapDrawable
oto kod do osiągnięcia roundedImageview:
źródło
@Gene skomentował powyższą odpowiedź, sugerując użycie
clipPath
jako opcji kadrowania obrazu jako koła.Oto czysta implementacja tego:
Można to dodać do klasy użytkowej.
źródło
c.drawBitmap(b, 0, 0, null);
, który używa domyślnej transformacji tożsamości.Myślę, że to rozwiązanie działa lepiej z każdym typem prostokąta, zmień rozmiar piksela, jeśli chcesz, aby obraz był mały lub duży:
źródło
Można to łatwo zrobić również w XML bez przycinania rzeczywistej mapy bitowej, wystarczy utworzyć okrągłą maskę obrazu i umieścić ją na rzeczywistym obrazie. Oto fragment kodu, którego użyłem:
circle.xml
your_layout.xml (Ignoruj "android: scaleType =" fitXY "", jeśli go nie potrzebujesz)
dimen.xml
Widok obrazu wyjściowego:
Mam nadzieję, że to może być przydatne dla kogoś !!! :)
źródło
możesz użyć tego kodu, to zadziała
źródło
możesz użyć tego kodu, to zadziała
źródło
Zalecam dodanie,
bitmap.recycle()
jeśli już go nie potrzebujesz, zapobiegnie to wystąpieniu błędu OutOfMemory.źródło
Oto wariant Kotlina wykorzystujący metodę rozszerzenia
źródło
Dla osób, które chcą mieć środek prostokąta (ja), dodaj to przed wycięciem:
Centrum kadrowania dla Androida
źródło
Bazując na odpowiedzi [Jachumbelechao Unto Mantekilla], ten kod działa jak urok dla osób szukających rozwiązania Kotlin:
źródło
Teraz, prawidłowa odpowiedź:
źródło
Kotin Fucntion
nazwij to tym kodem
źródło
Uważam, że najłatwiejszym rozwiązaniem jest utworzenie BitmapShadera swojej mapy bitowej, przekazanie go do obiektu malowania, a następnie wywołanie czegoś takiego jak canvas.drawCircle (cx, cy, radius, paint);
na przykład
W ten sposób zrobił to również https://github.com/hdodenhof/CircleImageView , kod źródłowy możesz przeczytać tutaj: https://github.com/hdodenhof/CircleImageView/blob/master/circleimageview/src/main/java /de/hdodenhof/circleimageview/CircleImageView.java
źródło
źródło
Nie jestem pewien, czy to kwestia programowania, ale ...
Najłatwiejszym rozwiązaniem byłoby ustawienie przezroczystości obszaru zewnętrznego w źródłowej mapie bitowej. W przeciwnym razie musisz obliczyć, które piksele znajdują się poza okręgiem i odpowiednio ustawić alfa (alfa = 0 dla pełnej przezroczystości).
źródło