Я пытаюсь применить размытое изображение к прозрачному изображению и получаю «темный ореол» по краям.
Джерри Хакстейбл кратко упомянул о проблеме , и очень хорошая демонстрация, показывающая, что проблема произошла:
Но я, по жизни моей, не могу понять, как " предварительно умноженная альфа"может решить проблему.Теперь для очень простого примера.у меня есть изображение 3х3, содержащее один красный и один зеленый пиксель:
На самом деле оставшиеся пиксели прозрачны:
Теперь мы применим Box Blur 3x3 к изображению.Для простоты мы рассчитаем только новое значение центрального пикселя.Способ размывания прямоугольника заключается в том, что, поскольку у нас есть квадрат из 9 позиций (3x3, называемый ядром), мы берем 1/9 каждого пикселя в ядре и складываем его:
Итак
finalRed = 1/9 * red1 + 1/9 * red2 + 1/9 * red3+ ... + 1/9 * red9
finalGreen = 1/9*green1 + 1/9*green2 + 1/9*green3+ ... + 1/9*green9
finalBlue = 1/9* blue1 + 1/9* blue2 + 1/9* blue3+ ... + 1/9* blue9
finalAlpha = 1/9*alpha1 + 1/9*alpha2 + 1/9*alpha3+ ... + 1/9*alpha9
В этом очень упрощенном примере вычисления становятся очень простыми:
finalRed = 1/9 * 255
finalGreen = 1/9 * 255
finalBlue = 0
finalAlpha = 1/9*255 + 1/9*255
Это дает мне окончательное значение цвета:
finalRed = 28
finalGreen = 28
finalBlue = 0
finalAlpha = 56 (22.2%)
Этот цвет слишком темный.Когда я выполняю размытие в 3px Box на том же изображении размером 3x3 пикселя в Photoshop, я получаю то, что ожидаю:
, что яснее при отображении на белом фоне:
На самом деле я выполняю размытие окна на растровом изображении, содержащем прозрачный текст, и текст приобретает контрольный темный цвет по краям:
Я начинаю с растрового изображения GDI + в формате PixelFormat32bppARGB
Как использовать «предварительно умноженную альфа» при применении ядра 3x3 для свертки?
Любой ответ должен включать новый форум, поскольку:
final = 1/9*(pixel1+pixel2+pixel3...+pixel9)
Получает неправильный ответ.
Редактировать: Более простой примерэто:
Я выполню эту математику с значениями цвета и альфа в диапазоне от 0..1:
Я собираюсь применитьсверточный фильтр размытия рамки до среднего пикселя:
ARGB'
= 1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0) +
1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0) +
1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0);
= (0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0) +
(0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0) +
(0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0)
= (0, 0.33, 0, 0.33)
Что дает довольно прозрачный темно-зеленый цвет.
Что не то, что яожидаю увидеть.Для сравнения, Photoshop's Box Blur выглядит так:
Если я предполагаю, что (0, 0.33, 0, 0.33)
- это предварительно умноженная альфа, и, если ее не умножить, я получаю:
(0, 1, 0, 0.33)
Что выглядит правильно для моего непрозрачного примера;но я не знаю, что делать, когда начинаю использовать частично прозрачные пиксели.
См. также