Search code examples
androidbitmapimageviewcolormatrixcolorfilter

Android apply colorMatrix colorFilter on part of imageView with a mask


I want to change the brightness on certain part of an image. I know how to use ColorMatrix to change the brightness(or hue) of an image. But it will be applied to the whole image.

I have a mask file (black and white image). I want to apply the brightness change only on the the white part of that mask.How to do this in Android?

Below is a mask image and the result I want to get.

enter image description here enter image description here


Solution

  • for given bitmap and mask:

    bitmap.png

    mask.png

    first create a temporary bitmap:

    bitmap = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.bitmap);
    mask = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.mask);
    
    float[] src = {
        0, 0, 0, 0, 255,
        0, 0, 0, 0, 255,
        0, 0, 0, 0, 255,
        1, 1, 1, -1, 0,
    };
    ColorMatrix cm = new ColorMatrix(src);
    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(cm);
    maskPaint = new Paint();
    maskPaint.setColorFilter(filter);
    maskPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
    
    filteredBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
    Canvas c = new Canvas(filteredBitmap);
    c.drawBitmap(bitmap, 0, 0, null);
    c.drawBitmap(mask, 0, 0, maskPaint);
    
    colorFilterPaint = new Paint();
    colorFilterPaint.setColorFilter(new LightingColorFilter(0xffffff, 0x880000));
    

    and draw it (I scaled it up since my emulator scaled it down):

    @Override
    public void draw(Canvas canvas) {
        canvas.save();
        canvas.scale(3, 3);
        canvas.drawBitmap(bitmap, 0, 0, null);
        canvas.drawBitmap(filteredBitmap, 0, 0, colorFilterPaint);
        canvas.restore();
    }
    

    and the result is:

    enter image description here