Как преобразовать кортеж цвета RGBA, пример (96, 96, 96, 202), к соответствующему кортежу цвета RGB?
Править:
То, что я хочу, должно получить значение RGB, которое является самым подобным кортежу RGBA визуально на белом фоне.
Я Активировал ответ Йоханнеса, потому что он прав в этом.
* Несколько комментариев были подняты, что мой первоначальный ответ был не правильным. Он работал, если альфа-значения были перевернуты из нормального. По определению, однако, это не будет работать в большинстве случаев. Поэтому я обновил формулу ниже, чтобы быть правильным для нормального случая. Это оказывается равным ответу @ Hkurabko ниже *
более конкретным ответом, однако, включает в себя альфа-значение в фактический результат цветов на основе непрозрачного цвета фона (или «матовый», как он называется).
Для этого есть алгоритм (из этого ссылки Wikipedia):
источника
. 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.
При необходимости необходимо вручную установить для полей экземпляра значение 0 или null. Можно также реализовать собственный объект NoDateTime (используя образец объекта null), чтобы выполнить то же самое. Хотя у меня было бы искушение не представлять время с нулевым значением, есть ли причина, по которой вы не можете сделать это?
-121--4859838-Вы должны попытаться использовать Windbg , анализ аварийного дампа должен указывать на проблему, если ваши подозрения правы и это проблема синхронизации, причину проблемы может быть трудно обнаружить.
-121--4013195-Это зависит от используемого цветового пространства. Если RGBA находится в предварительно умноженном цветовом пространстве и полупрозрачен, необходимо разделить альфа, чтобы получить правильный цвет RGB. Если цвет находится в неумноженном цветовом пространстве, то альфа-канал можно просто отбросить.
хм ... относительно
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).