Объединить два 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));
Другие вопросы по тегам