ColorMatrix чтобы спасти!
Цитирование документов Android, ColorMatrix:
5x4 матрица для преобразования
цвет + альфа-компоненты растрового изображения.
Матрица хранится в одном
массив, и его обрабатывают следующим образом: [
a, b, c, d, e, f, g, h, i, j, k, l, m,
n, o, p, q, r, s, t] Применительно к
цвет [r, g, b, a], результирующий
цвет вычисляется как (после зажима)
R '= a R + b G + c B + d A + e; G '=
f R + g G + h B + i A + j; B '= k R +
l G + m B + n A + o; A '= p R + q G +
r B + s A + t;
Установите цветовую матрицу, которая принимает альфа-значение из красного канала (или зеленого, или синего, не имеет значения для оттенков серого ...), затем используйте его в Paint.setColorFilter()
. Вот более или менее полный пример:
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inScaled = false;
// Load source grayscale bitmap
Bitmap grayscale = BitmapFactory.decodeResource(getResources(), R.drawable.my_grayscale_mask, options);
// Place for alpha mask. It's specifically ARGB_8888 not ALPHA_8,
// ALPHA_8 for some reason didn't work out for me.
Bitmap alpha = Bitmap.createBitmap(grayscale.getWidth(), grayscale.getHeight(),
Bitmap.Config.ARGB_8888);
float[] matrix = new float[] {
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 0, 0, 0, 0};
Paint grayToAlpha = new Paint();
grayToAlpha.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(matrix)));
Canvas alphaCanvas = new Canvas(alpha);
// Make sure nothing gets scaled during drawing
alphaCanvas.setDensity(Bitmap.DENSITY_NONE);
// Draw grayscale bitmap on to alpha canvas, using color filter that
// takes alpha from red channel
alphaCanvas.drawBitmap(grayscale, 0, 0, grayToAlpha);
// Bitmap alpha now has usable alpha channel!