Решение user487252 работает как брелок до API уровня 16 (Jelly Bean), после которого AvoidXfermode
, похоже, не работает вообще.
В моем конкретном случае использованияЯ преобразовал страницу PDF (через APV PDFView) в массив пикселей int[]
, который я собираюсь передать в Bitmap.createBitmap( int[], int, int, Bitmap.Config )
.Эта страница содержит штриховые рисунки, нарисованные на белом фоне, и мне нужно удалить фон, сохранив сглаживание.
Я не смог найти режим Портера-Даффа, который делал именно то, что я хотел, поэтому яв конечном итоге прогибался и перебирал пиксели и преобразовывал их один за другим.Результат оказался удивительно простым и производительным:
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 );
Это идеально подходит для рисования штриховых рисунков, поскольку для линий можно использовать любой цвет без потери сглаживания.Я использую красный канал здесь, но вы можете использовать зеленый, сдвигая 16
бит вместо 8
, или синий, сдвигая 24
.