Android ColorFilter - Режимы Porter-Duff

Я пытаюсь решить проблему с android ColorFilters. Документация очень плохая, поэтому основной метод - это разные варианты.

Проблема:

Есть растровое изображение. Некоторые пиксели имеют альфа = 255, другие - альфа = 0. Я пытаюсь нарисовать круг с определенным цветом. Я хочу, чтобы альфа-канал не изменялся в растровом изображении, но при рисовании я хочу умножить цвет на растровое-альфа.

Итак, рисуя круг, я хочу, чтобы пиксели с альфа = 0 не были окрашены, но пиксели с альфа = 255 для окрашивания в цвет, который я хочу. Альфа-канал не должен меняться.

Я пытаюсь использовать porter-duff ColorFilter (класс PorterDuffColorFilter в android sdk).

на официальном сайте здесь слишком много режимов и непонятного описания: http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

Я думаю, что я должен использовать DST_ATOP или SRC_ATOP, но они не работают, как я описал.

Кроме того, существует странный параметр srcColor в конструкторе цветокорректора портер-дафф.

Я не могу понять, что означает "Sa" и "Sc" в формулах [Da, Sc * Da + (1 - Sa) * Dc]. Он может быть от цвета, который был передан в конструктор colorfilter, а также может быть установлен цветом "paint.setColor".

Кто-нибудь знает, как это работает?

Ответ 1

Sa и Sc являются шортами для "исходного альфа" и "цвета источника" соответственно. Параметр srcColor в конструкторе PorterDuffColorFilter - это цвет, используемый для этих значений.

В вашем случае Mode.MULTIPLY, вероятно, будет работать лучше всего.

Ответ 2

Обратите внимание, что режимы Портера-Даффа определены только для правильной работы с предварительно умноженной альфой. Это означает, что ни одна из компонент R, G или B не может превышать альфа-значение.

проект GitHub для проекта Android, который отображает все режимы Porter-Duff. Android-приложение также доступно на Playstore.

Ответ 3

После некоторых исследований я пришел к следующим выводам относительно режимов PorterDuff Color в Android,

  • Sa и Sc - Source Alpha и Source Color, например если я устанавливаю ColorFilter на drawable, например myDrawable.setColorFilter(желаемый цвет, режим .SRC_ATOP), значения Sa и Sc будут взяты из искомого цвета, а не из myDrawable. Да и Dc будут оригинальными значениями альфа и цвета myDrawable.
  • У меня было изображение, и я хочу применить определенный цвет с альфа-значениями от ввода пользователем. Я пытался использовать PorterDuff Modes, My original myDrawable был доступен для девяти патчей и имел прозрачный фон и треугольные углы, такие как треугольники треугольников обмена сообщениями. Когда я использовал

    публичный статический окончательный PorterDuff.Mode SRC  [Sa, Sc]

который применяет цвет источника и источник Alpha, который я предположил, что значения Color и Alpha выше установленного метода setColorFilter желательны. Я получил правильные цветовые значения, то есть цвет и альфа были правильно применены к новому Drawable, но треугольник на этом изображении был полностью вымыт/удален. Поэтому мне пришлось использовать ColorMatrixFilter и установить матрицу и установить значение alpha отдельно для рисования.