Android bitmap mask color, remove color

前端 未结 3 467
长情又很酷
长情又很酷 2020-12-05 12:00

I am creating bitmap, next i am drawing second solid color bitmap on top of it. And now i want to change first bitmap, so solid color that i drawed on it will be transparent

3条回答
  •  甜味超标
    2020-12-05 12:41

    user487252's solution works like a charm up until API level 16 (Jelly Bean), after which AvoidXfermode does not seem to work at all.

    In my particular use case, I have rendered a page of a PDF (via APV PDFView) into a pixel array int[] that I am going to pass into Bitmap.createBitmap( int[], int, int, Bitmap.Config ). This page contains line art drawn onto a white background, and I need to remove the background while preserving the anti-aliasing.

    I couldn't find a Porter-Duff mode that did exactly what I wanted, so I ended up buckling and iterating through the pixels and transforming them one by one. The result was surprisingly simple and performant:

    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 );
    

    This is perfect for drawing line art, since any color can be used for the lines without losing the anti-aliasing. I'm using the red channel here, but you can use green by shifting 16 bits instead of 8, or blue by shifting 24.

提交回复
热议问题