Смешайте формулу для GDI + - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть цвет A, который я хотел бы преобразовать в цвет C, используя цвет B. Поэтому я хотел бы знать формулу смешивания F в GDI +, где F = F (A, B) = C. A - это «нижний цвет», а B - это цвет наложения выше A, который вместе с A дает C.

Приветствия

// Магнус

Ответы [ 2 ]

2 голосов
/ 12 ноября 2009

Это называется Альфа-смешение .

Используйте следующий алгоритм для компонентов R, G и B, где альфа составляет от 0 до 1.

newColor = MAX(255, (1 - alpha) * background + alpha * overlay)
0 голосов
/ 08 февраля 2010

В основном (альфа, красный, зеленый и синий по шкале от 0 до 1):

Результат. Альфа = BackColor.Alpha + ForeColor.Alpha - (BackColor.Alpha * ForeColor.Alpha)
Result.Red = ((ForeColor.Red * ForeColor.Alpha) + (BackColor.Red * BackColor.Alpha * (1 - ForeColor.Alpha))) / Result.Alpha
(Замените «красный» на «зеленый» и «синий» выше, чтобы получить соответствующие функции.)

Для 32-битного цвета в VB.NET (несколько оптимизировано):

Shared Function Flatten(ByVal BackColor As Color, ByVal ForeColor As Color) As Color
    If ForeColor.A = 0 Then Return BackColor ' Prevent division by zero
    If ForeColor.A = 255 Then Return ForeColor ' Shortcut

    Dim BackAlphaDbl As Single = CSng(BackColor.A) ' Convert to single to prevent in-calculation 8 bit overflow 
    Dim ForeAlphaDbl As Single = CSng(ForeColor.A)

    Dim ForeAlphaNormalized As Single = ForeAlphaDbl / 255 ' Precalculate for triple use
    Dim BackcolorMultiplier As Single = BackAlphaDbl * (1 - ForeAlphaNormalized) ' Precalculate 

    Dim Alpha As Single = BackAlphaDbl + ForeAlphaDbl - BackAlphaDbl * ForeAlphaNormalized

    Return Color.FromArgb(Alpha, (ForeColor.R * ForeAlphaDbl + BackColor.R * BackcolorMultiplier) / Alpha, (ForeColor.G * ForeAlphaDbl + BackColor.G * BackcolorMultiplier) / Alpha, (ForeColor.B * ForeAlphaDbl + BackColor.B * BackcolorMultiplier) / Alpha)
End Function

Я выяснил это с помощью бумаги и карандаша и проверил это, наложив изображения с помощью GDI + и протестировав полученные цвета. Единственная разница между этой функцией и GDI + заключается в том, что GDI + непоследовательно округляется вверх и вниз при изменении альфа на переднем плане. Эта функция более точная.

...