Вы просто хотите удалить альфа-канал? Или вам нужен результат RGB наложения RGBA на (например) белый фон?
Бен Джеймс
1
Вы можете прочитать знаменитую статью «Составление цифровых изображений» (Портер и Дафф) для получения полной информации об альфа-композиции: keithp.com/~keithp/porterduff
kusma
Ответ Андраса Золтана и Хкурабко также полезен для расчета противоположного, я имею в виду, что если у вас есть различные цвета с альфа-смешением и исходный фон (матовый), вы можете рассчитать исходный цвет RGBA, который я искал while;)
nacho4d
Ответы:
90
Я поддержал ответ Йоханнеса, потому что он прав в этом.
* Было высказано несколько комментариев о том, что мой первоначальный ответ был неправильным. Это работало, если альфа-значения были инвертированы по сравнению с нормальными. Однако по определению в большинстве случаев это не сработает. Поэтому я обновил приведенную ниже формулу, чтобы она соответствовала нормальному случаю. Это в конечном итоге равно ответу @ hkurabko ниже *
Однако более конкретный ответ включает альфа-значение в фактический результат цвета на основе непрозрачного цвета фона (или «матового», как его называют).
Для этого есть алгоритм (из этой ссылки в википедии):
Нормализуйте значения RGBA, чтобы все они находились в диапазоне от 0 до 1 - для этого просто разделите каждое значение на 255. Назовем результатSource .
Нормализуйте также матовый цвет (черный, белый или какой угодно). Назовем результат BGColorNote - если цвет фона также является прозрачным, вам придется сначала повторить процесс для этого (опять же, выбрав матовый цвет), чтобы получить исходный RGB для этой операции.
Теперь преобразование определяется как (здесь полный псевдокод!):
Чтобы получить окончательные значения 0-255 Target, просто умножьте все нормализованные значения на 255, убедившись, что вы ограничены 255, если какое-либо из комбинированных значений превышает 1,0 (это чрезмерная экспозиция, и есть более сложные алгоритмы, решающие эту проблему. которые включают обработку всего изображения и т. д.).
РЕДАКТИРОВАТЬ: В своем вопросе вы сказали, что хотите белый фон - в этом случае просто исправьте BGColor на 255,255,255.
В свете редактирования вопроса это очень точный и хороший ответ. Я удалил свой и надеюсь, что вы всплывете, так как вы объяснили суть дела лучше :)
Джоуи,
Я думаю, этот ответ предполагает, что цвет фона - rgb, а не rgba.
Лев,
Это необычно, учитывая, что RGBA (0,0,0,1) полностью непрозрачный черный. Но с данным алгоритмом он был бы полностью прозрачным черным. Я думаю, что изменение алгоритма, чтобы отразить это, сделало бы его более полезным ресурсом и лучшим ответом на вопрос.
Брайан Рейнер
1
@BryanRayner добавил некоторые правки к моему ответу. Я регулярно получаю положительные голоса за этот ответ, и возможно, что некоторые люди находят его, и им приходится самостоятельно инвертировать алгоритм. Лучше бы она была полнее. Благодарю.
Андрас Золтан
2
Если кому-то еще интересно, этот JSBin позволяет наблюдать за трансформируемым цветом. Также он готов к использованию в качестве функции javacript. Я использовал BGColor как белый, потому что просто не понимаю концепции матового (извините!). Ссылка выглядит следующим образом: jsbin.com/qocixeh/edit?html,js,console,output, а также суть: gist.github.com/vladimirbrasil/bd139851ff757a1c8cb46fac93e733eb Надеюсь, это тоже поможет. Огромное спасибо за ответ!
Я считаю, что вы правы. Википедия и ответ Андраса Золтана немного отличаются.
nacho4d
1
Я согласен, используйте эту версию, а не версию @Andras Zoltan. Для тестового сценария конвертируйте rgba (0,0,0, .7) в фоновый rgb (255,255,255), используя обе формулы; Форумла хкурабко явно дает правильный ответ.
Ryre
4
Андрас определяет 0 альфа как непрозрачный и 255 как прозрачный, в то время как CSS определяет это наоборот. Этот ответ работает с определением альфа-канала в CSS.
Кейси Чу,
1
+1 Это работает с наиболее распространенным определением альфа-канала (0 = прозрачный), например, OpenGL, SDL, графические редакторы.
DLight
+1 - и я обновил свой ответ, чтобы работать с альфой, являющейся «правильным путем», согласно этому тоже. По иронии судьбы, просто попытавшись использовать свое решение для этого, я согласен с тем, что мой первоначальный ответ, хотя и имел определенный смысл, на самом деле не работал для большинства приложений.
Андрас Золтан,
8
В моем случае я хотел преобразовать изображение RGBA в RGB, и следующее сработало так, как ожидалось:
Это зависит от используемого вами цветового пространства. Если RGBA находится в предварительно умноженном цветовом пространстве и является полупрозрачным, вам необходимо разделить альфа-канал, чтобы получить правильный цвет RGB. Если цвет находится в цветовом пространстве без предварительного умножения, вы можете просто отказаться от альфа-канала.
Ответы:
Я поддержал ответ Йоханнеса, потому что он прав в этом.
* Было высказано несколько комментариев о том, что мой первоначальный ответ был неправильным. Это работало, если альфа-значения были инвертированы по сравнению с нормальными. Однако по определению в большинстве случаев это не сработает. Поэтому я обновил приведенную ниже формулу, чтобы она соответствовала нормальному случаю. Это в конечном итоге равно ответу @ hkurabko ниже *
Однако более конкретный ответ включает альфа-значение в фактический результат цвета на основе непрозрачного цвета фона (или «матового», как его называют).
Для этого есть алгоритм (из этой ссылки в википедии):
Source
.BGColor
Note - если цвет фона также является прозрачным, вам придется сначала повторить процесс для этого (опять же, выбрав матовый цвет), чтобы получить исходный RGB для этой операции.Теперь преобразование определяется как (здесь полный псевдокод!):
Чтобы получить окончательные значения 0-255
Target
, просто умножьте все нормализованные значения на 255, убедившись, что вы ограничены 255, если какое-либо из комбинированных значений превышает 1,0 (это чрезмерная экспозиция, и есть более сложные алгоритмы, решающие эту проблему. которые включают обработку всего изображения и т. д.).РЕДАКТИРОВАТЬ: В своем вопросе вы сказали, что хотите белый фон - в этом случае просто исправьте BGColor на 255,255,255.
источник
хм ... что касается
http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
решение, предоставленное Андрасом Золтаном, следует немного изменить на:
Эта измененная версия мне подходит, потому что в пред. версия rgba (0,0,0,0) с матовым rgb (ff, ff, ff) будет изменена на rgb (0,0,0).
источник
В моем случае я хотел преобразовать изображение RGBA в RGB, и следующее сработало так, как ожидалось:
источник
Это зависит от используемого вами цветового пространства. Если RGBA находится в предварительно умноженном цветовом пространстве и является полупрозрачным, вам необходимо разделить альфа-канал, чтобы получить правильный цвет RGB. Если цвет находится в цветовом пространстве без предварительного умножения, вы можете просто отказаться от альфа-канала.
источник
Вот удобная функция SASS в соответствии с ответами Андраса и Хкурабко.
Применение:
источник
mix($color, white, $alpha*100)
Вот код Java (работает на Android API 24):
функция:
источник