Не забудьте предварительно умножить цвета перед изменением альфа-канала и повторно умножить их потом.
Предварительно умноженный цвет (часто называемый «предварительно умноженная альфа», который вводит в заблуждение) означает, что компоненты цвета сохраняются уже умноженными на альфа, чтобы облегчить наложение. Обычная операция компоновки (источник поверх) выглядит так:
result = (source.rgb * source.a) + (destination.rgb * (1.0 - destination.a));
Предварительное умножение означает, что первое умножение уже выполнено, поэтому его можно пропустить:
result = source.rgb + (destination.rgb * (1.0 - destination.a));
Когда вы изменяете альфу без изменения предварительно умноженных цветовых компонентов, результат не меняется - когда вы рисуете изображение, оно не будет выглядеть иначе, потому что цвета по-прежнему предварительно умножаются старой альфа.
Таким образом, вам необходимо предварительно умножить цвета, то есть разделить каждый из них на альфа (как это было ранее умножено, так что теперь вы должны сделать обратное), прежде чем изменять альфа. Затем, после изменения альфы, предварительно умножьте цвета на новую альфа.
Конечно, это означает, что при изменении альфа на ноль все цвета станут черными (r = g = b = 0). Поэтому убедитесь, что вы сохранили исходное изображение, если пользователь может захотеть изменить его обратно.
Вероятно, было бы более эффективно и, конечно, было бы проще просто нарисовать исходное изображение (без каких-либо изменений в нем) в любой альфе, которую хочет пользователь. Вы можете сделать это, изменив глобальное значение альфа-контекста дисплея , прежде чем нарисовать изображение.