По сути, этот бит кода меняет цвет каждого из каналов RBG в изображении.Я постараюсь разбить его построчно.
int r = ( pix[index] >> 16 ) & 0xff;
int g = ( pix[index] >> 8 ) & 0xff;
int b = pix[index] & 0xff;
Бит кода выше просто получает собственные значения красного, синего и зеленого.
RY = ( 70 * r - 59 * g - 11 * b ) / 100;
GY = (-30 * r + 41 * g - 11 * b ) / 100;
BY = (-30 * r - 59 * g + 89 * b ) / 100;
Они возвращаются обратно впозже, но обратите внимание, что RY будет в основном красным, BY в основном синим, а GY будет смесью зеленого и красного.Одной из ключевых особенностей является то, что все 3 множителя складываются в 0, сохраняя нейтральность коррекции (изображение не станет ярче).GY на самом деле не имеет значения, так как он не используется нигде в коде.
Y = ( 30 * r + 59 * g + 11 * b ) / 100;
RYY = ( S * BY + C * RY ) / 256;
BYY = ( C * BY - S * RY ) / 256;
GYY = (-51 * RYY - 19 * BYY ) / 100;
Опять же, просто применяя формулу для получения желаемых эффектов тонирования.S и C - это значения Sin и Cos для угла, переданного в функцию, как она вызывается.Оттенок зависит от пройденного угла.Под углом 0 изображение будет ближе к нормальным цветам, так как угол меняется, он будет стремиться изменить красный на синий, синий на красный, и зеленый будет некой комбинацией двух, в основном зависящих от красного.