Я реализовывал фотофильтры, похожие на то, что делает наше приложение для iOS.Они делают что-то вроде source bitmap + mask bitmap + blend mode + alpha value
.Чтобы добиться идентичного поведения, я просто увеличил альфа маски.Вот как наконец-то выглядит мой код:
public static Bitmap blend(Bitmap back, Bitmap front, BlendMethod method, float alpha) {
if (alpha != 1.0F) {
front = makeTransparent(front, Math.round(alpha * 255));
}
Bitmap.Config config = back.getConfig();
int width = back.getWidth();
int height = back.getHeight();
if (width != front.getWidth() || height != front.getHeight()) {
Log.e(TAG, "Arrays must be of identical size! Do bitmap scaling prior to blending.");
return null;
}
int[] frontArr = new int[height * width], backArr = new int[height * width], resultArr;
back.getPixels(backArr, 0, width, 0, 0, width, height);
front.getPixels(frontArr, 0, width, 0, 0, width, height);
resultArr = jniBlend(frontArr, backArr, alpha, method.toInt());
return Bitmap.createBitmap(resultArr, width, height, config);
}
public static Bitmap blend(Bitmap back, Bitmap front, BlendMethod method) {
return blend(back, front, method, 1F);
}
public static Bitmap makeTransparent(Bitmap src, int value) {
int width = src.getWidth();
int height = src.getHeight();
Bitmap transBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(transBitmap);
canvas.drawARGB(0, 0, 0, 0);
// config paint
final Paint paint = new Paint();
paint.setAlpha(value);
canvas.drawBitmap(src, 0, 0, paint);
return transBitmap;
}
Обратите внимание, что jniBlend - это некоторый метод, который я написал самостоятельно, он ведет себя как стандартные режимы PorterDuff в Java.
Метод makeTransparent
не мой- нашел его здесь : (ответ от Рубан )