user487252's solution działa jak czar się aż do poziomu API 16 (Jelly Bean), po czym AvoidXfermode
nie wydają się działać w ogóle.
W moim przypadku użycia renderowałem stronę PDF (przez APV PDFView) do tablicy pikseli int[]
, którą zamierzam przekazać Bitmap.createBitmap(int[], int, int, Bitmap.Config)
. Ta strona zawiera rysunki rysowane na białym tle i muszę usunąć tło, zachowując antyaliasing.
Nie mogłem znaleźć trybu Porter-Duff, który zrobił dokładnie to, co chciałem, więc skończyłem na wyboczeniu i iteracji poprzez piksele i przekształceniu ich jeden po drugim. Wynik był zaskakująco prosty i wydajnych:
int [] pixels = ...;
for(int i = 0; i < pixels.length; i++) {
// Invert the red channel as an alpha bitmask for the desired color.
pixels[i] = ~(pixels[i] << 8 & 0xFF000000) & Color.BLACK;
}
Bitmap bitmap = Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888);
Jest idealny do rysowania linii sztuki, ponieważ każdy kolor może być stosowany dla linii bez utraty antyaliasingu. Używam tutaj czerwonego kanału, ale możesz użyć koloru zielonego przesuwając bity 16
zamiast 8
lub niebieski, przesuwając 24
.
Dzięki, ale w końcu zorientowałem się, jak to zrobić z porterduff, xfermode (xor) zrobił to, ale zastosowałem do innej bitmapy, najpierw scaliłem maskę i źródło i próbowałem narysować to na płótnie z filtrem koloru, ale w końcu zrozumiałem że powinienem używać xfermode podczas rysowania maski na źródle, a nie na płótnie :) – ZZZ