Основные сведения об использовании ColorMatrix и ColorMatrixColorFilter для изменения оттенка Drawable

Я работаю над пользовательским интерфейсом для приложения, и я пытаюсь использовать значки в градациях серого и позволяю пользователю изменять тему на цвет по своему выбору. Для этого я пытаюсь просто применить какой-то ColorFilter, чтобы наложить цвет поверх рисованного. Я пробовал использовать PorterDuff.Mode.MULTIPLY, и он работает почти так, как мне нужно, за исключением того, что белые цвета также накладываются на цвет. В идеале я ищу что-то вроде режима наложения «Цвет» в Photoshop, где графика сохраняет свою прозрачность и яркость, а только изменяет цвет изображения. Например:

alt text становится alt text

После некоторого исследования выяснилось, что класс ColorMatrixColorFilter может делать то, что мне нужно, но я не могу найти какие-либо ресурсы, указывающие на то, как используется матрица. Это матрица 4х5, но мне нужно знать, как я подхожу к проектированию матрицы. Есть идеи?

РЕДАКТИРОВАТЬ: Итак, что я нашел до сих пор по этому поводу, следующее:

1 0 0 0 0 //red
0 1 0 0 0 //green
0 0 1 0 0 //blue
0 0 0 1 0 //alpha

Где эта матрица является единичной матрицей (когда применяется, не вносит изменений), а числа варьируются от 0 до 1 (плавает). Эта матрица будет умножаться на каждый пиксель для преобразования в новый цвет. Вот тут-то мне и становится неясно. Поэтому я бы подумал, что каждый пиксель будет вектором 1 x 4, содержащим значения argb (например, 0,2, 0,5, 0,8, 1 ), которые будут отмечены матрицей преобразования. Таким образом, чтобы удвоить интенсивность красного цвета изображения, вы должны использовать такую ​​матрицу, как:

2 0 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
0 0 0 1 0 

, которая даст вам вектор (цвет) 0,4, 0,5, 0,8, 1 . Судя по ограниченному тестированию, это так и работает правильно, но на самом деле я все еще сталкиваюсь с той же проблемой (т.е. белые приобретают окраску). Дальнейшее чтение говорит мне, что это связано с тем, что он выполняет преобразование значений RGB, тогда как для сдвига оттенка значения сначала должны быть преобразованы в значения HSL. Так что, возможно, я мог бы написать класс, который бы считывал изображение, преобразовывал цвета и перерисовывал изображение с новыми цветами. Это создает ДРУГОЙ проблему с StateListDrawables, так как я не уверен, как я буду собирать каждый из них в коде и изменять все из них, и насколько медленным это будет процесс. : /

Хм, хорошо, так что я предполагаю, что у меня возник бы еще один вопрос: можно ли использовать матрицу для преобразования RGB в другое цветовое пространство с информацией о яркости, например L a b или HSL? Если это так, я мог бы просто умножить матрицу для этого разговора, затем отрегулировать оттенок для этой матрицы, а затем применить эту матрицу как ColorFilter.

114
задан kcoppock 5 December 2010 в 21:09
поделиться