Как да преобразувам растерно изображение в скали на сивото в алфа маска?

Имам JPG картина в сива скала и бих искал да я заредя в Bitmap във формат Bitmap.Config.ALPHA_8. Възможно ли е това, как мога да го направя?

Лесно е да заредите алфа канал от PNG (който може да има празни R,G,B канали), но бих искал да използвам JPG за компресия.

Това е допълнителен въпрос към Как да комбинирате две непрозрачни растерни изображения в едно с алфа канал?


person Pēteris Caune    schedule 24.02.2011    source източник


Отговори (1)


ColorMatrix за спасяване!

Цитирайки Android документи, ColorMatrix:

5x4 матрица за трансформиране на цвят+алфа компоненти на Bitmap. Матрицата се съхранява в единичен масив и се третира по следния начин: [ 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' = aR + bG + cB + dA + e; G' = fR + gG + hB + iA + j; B' = kR + lG + mB + nA + o; A' = pR + qG + rB + sA + 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!
person Pēteris Caune    schedule 25.02.2011
comment
Тази матрица няма ли да извади от маската само червения канал? Това трябва да работи, разбира се, ако източникът наистина е сива скала. Как би изглеждал mactix за обикновен RGB? В долния ред 0.333, 0.333, 0.334, 0, 0 предполагам. Това вярно ли е? - person Hermann Klecker; 23.02.2015