Объединить два ColorMatrix или применить два или более ColorMatrix одновременно на ImageView
Я изменяю яркость, контрастность, насыщенность и оттенок ImageView. Я много искал по нему.
Я получил некоторый код, который работает с ColorMatrix.
[1.] Для Яркости ColorMatrix это что-то вроде
float brightness = (-50F * 1.5F);
ColorMatrix cmB = new ColorMatrix();
cmB.set(new float[] { 1, 0, 0, 0, brightness,
0, 1, 0, 0,brightness,
0, 0, 1, 0, brightness,
0, 0, 0, 1, 0 });
myImageView.setColorFilter(new ColorMatrixColorFilter(cmB));
который работает правильно.
[2.] Для Contrast ColorMatrix - это нечто иное, что также работает правильно.
НО, все эти ColorMatrix работает индивидуально. Означает, что эффект последнего примененного ColorMatrix является только сценой в ImageView, потому что он делает именно это, что устраняет эффект ранее примененного ColorMatrix и устанавливает последний применяет ColorMatrix.
Теперь я хочу MERGE или перепутать ColorMatrix of All одновременно. Значит хочу применить ColorMatrix of Contrast по эффекту ColorMatrix от Brightnrs / Saturation / Hue.
2 ответа
Если вы хотите применить две цветовые матрицы, просто умножьте их вместе.
Если у вас есть цветовая матрица A и цветовая матрица B, то:
C = B * A;
outpixel = C * inpixel
эквивалентно
outpixel = B * A * inpixel
РЕДАКТИРОВАТЬ
Я просто заметил, что это матрицы 5х4 (изначально я думал, что они 4х4). Поскольку вы не можете умножить их напрямую, я думаю, что было бы целесообразно добавить 5-ю строку идентификаторов (0,0,0,0,1) к обеим матрицам перед умножением (чтобы сделать их оба 5х5), и отбросить 5-ю строку после множатся.
Вы можете применить несколько таких матриц:
ColorMatrix colorFilterMatrix = new ColorMatrix();
colorFilterMatrix.postConcat(getContrastMatrix(contrast));
colorFilterMatrix.postConcat(getBrightnessMatrix(brightness));
imageView.setColorFilter(new ColorMatrixColorFilter(colorFilterMatrix));