Преобразуйте цвет RGBA в RGB

Как преобразовать кортеж цвета RGBA, пример (96, 96, 96, 202), к соответствующему кортежу цвета RGB?

Править:

То, что я хочу, должно получить значение RGB, которое является самым подобным кортежу RGBA визуально на белом фоне.

74
задан Stéphane Bruckert 21 August 2014 в 19:48
поделиться

3 ответа

Я Активировал ответ Йоханнеса, потому что он прав в этом.

* Несколько комментариев были подняты, что мой первоначальный ответ был не правильным. Он работал, если альфа-значения были перевернуты из нормального. По определению, однако, это не будет работать в большинстве случаев. Поэтому я обновил формулу ниже, чтобы быть правильным для нормального случая. Это оказывается равным ответу @ Hkurabko ниже *

более конкретным ответом, однако, включает в себя альфа-значение в фактический результат цветов на основе непрозрачного цвета фона (или «матовый», как он называется).

Для этого есть алгоритм (из этого ссылки Wikipedia):

  • нормализовать значения RGBA, чтобы они все от 0 до 1 - просто разделите каждое значение на 255, чтобы сделать это. Мы позвоним в результате источника .
  • Нормализуется также матовый цвет (черный, белый, что угодно). Мы позвоним в результате BGCLOR Примечание - Если цвет фона также является прозрачным, то вам придется резать процесс для этого сначала (опять же, выбирая матовый), чтобы получить исходный RGB Для этой операции.
  • Теперь преобразование определяется как (в полный код PSEDO здесь!):

     Источник => Target = (BGColor + Source) =
    Target.r = ((1 - source.a) * bgcolor.r) + (Source.a * Source.r)
    Target.g = ((1 - Source.a) * BGColor.g) + (Source.a * Source.g)
    Target.b = ((1 - source.a) * bgcolor.b) + (Source.a * Source.b)
     

Чтобы получить финальные значения 0-255 для целевого значения Вы просто размножаете все нормализованные значения обратно на 255, убедившись, что вы нагреваете на 255, если какое-либо из комбинированных значений превышает 1,0 (это превышает Экспозиция и есть более сложные алгоритмы, занимающиеся этим, что включает в себя целую обработку изображений и т. Д.).

Редактировать: В вашем вопросе вы сказали, что хотите белого фона - в этом случае просто исправьте BGCLOR до 255,2555,255.

87
ответ дан 24 November 2019 в 11:59
поделиться

При необходимости необходимо вручную установить для полей экземпляра значение 0 или null. Можно также реализовать собственный объект NoDateTime (используя образец объекта null), чтобы выполнить то же самое. Хотя у меня было бы искушение не представлять время с нулевым значением, есть ли причина, по которой вы не можете сделать это?

-121--4859838-

Вы должны попытаться использовать Windbg , анализ аварийного дампа должен указывать на проблему, если ваши подозрения правы и это проблема синхронизации, причину проблемы может быть трудно обнаружить.

-121--4013195-

Это зависит от используемого цветового пространства. Если RGBA находится в предварительно умноженном цветовом пространстве и полупрозрачен, необходимо разделить альфа, чтобы получить правильный цвет RGB. Если цвет находится в неумноженном цветовом пространстве, то альфа-канал можно просто отбросить.

4
ответ дан 24 November 2019 в 11:59
поделиться

хм ... относительно

http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending

решения, предоставленного Андрасом Золтаном, следует немного изменить на:

Source => Target = (BGColor + Source) =
Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R)
Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G)
Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)

Эта измененная версия отлично работает для мне, потому что в пред. версия rgba (0,0,0,0) с матовым rgb (ff, ff, ff) будет изменена на rgb (0,0,0).

37
ответ дан 24 November 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: