Сведения о вопросе

Getthesound

16:03, 1st July, 2020

Теги

c#   colors    

Преобразование ARBG в RGB с Альфа-смешиванием

Просмотров: 520   Ответов: 3

Допустим, что у нас есть цвет ARGB:

Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.

Когда это окрашено поверх существующего цвета, цвета будут смешиваться. Таким образом, когда он смешивается с белым, результирующий цвет составляет Color.FromARGB(255, 162, 133, 255);

Решение должно работать следующим образом:

Color blend = Color.White; 
Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.      
Color rgb = ToRGB(argb, blend); //Same as Color.FromARGB(255, 162, 133, 255);

Что такое реализация ToRGB?



  Сведения об ответе

DO__IT

18:03, 1st July, 2020

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

В psuedocode, предполагая, что цвет фона (blend) всегда имеет 255 Альфа. Также предполагается, что альфа - это 0-255.

alpha=argb.alpha()
r = (alpha/255)*argb.r() + (1 - alpha/255)*blend.r()
g = (alpha/255)*argb.g() + (1 - alpha/255)*blend.g()
b = (alpha/255)*argb.b() + (1 - alpha/255)*blend.b()

Примечание: вам, вероятно, нужно быть немного (более) осторожным в вопросах floating-point/int математики и округления, в зависимости от языка. Литые промежуточные продукты соответственно

Отредактированы, чтобы добавить:

Если у вас нет цвета фона с Альфой 255, алгебра становится намного сложнее. Я уже делал это раньше, и это забавное упражнение оставлено для читателя (если вам действительно нужно знать, задайте другой вопрос :).

Другими словами, какой цвет C сливается с некоторым фоном так же, как смешивание A, а затем смешивание B. Это похоже на вычисление A+B (что не то же самое, что B+A).


  Сведения об ответе

SILA

18:03, 1st July, 2020

Я знаю, что это старая нить, но я хочу добавить это:

Public Shared Function AlphaBlend(ByVal ForeGround As Color, ByVal BackGround As Color) As Color
    If ForeGround.A = 0 Then Return BackGround
    If BackGround.A = 0 Then Return ForeGround
    If ForeGround.A = 255 Then Return ForeGround
    Dim Alpha As Integer = CInt(ForeGround.A) + 1
    Dim B As Integer = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8
    Dim G As Integer = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8
    Dim R As Integer = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8
    Dim A As Integer = ForeGround.A

    If BackGround.A = 255 Then A = 255
    If A > 255 Then A = 255
    If R > 255 Then R = 255
    If G > 255 Then G = 255
    If B > 255 Then B = 255

    Return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B))
End Function

public static Color AlphaBlend(Color ForeGround, Color BackGround)
{
    if (ForeGround.A == 0)
        return BackGround;
    if (BackGround.A == 0)
        return ForeGround;
    if (ForeGround.A == 255)
        return ForeGround;

    int Alpha = Convert.ToInt32(ForeGround.A) + 1;
    int B = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8;
    int G = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8;
    int R = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8;
    int A = ForeGround.A;

    if (BackGround.A == 255)
        A = 255;
    if (A > 255)
        A = 255;
    if (R > 255)
        R = 255;
    if (G > 255)
        G = 255;
    if (B > 255)
        B = 255;

    return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B));
}


  Сведения об ответе

COOL

18:03, 1st July, 2020

если вам не нужно знать эту предварительную визуализацию, вы всегда можете использовать метод win32 getpixel, я полагаю.

Примечание: набрав на iPhone в середине Миссури без доступа к inet. Будет искать реальный пример win32 и посмотреть, есть ли эквивалент .net.

Если кому-то интересно, и он не хочет использовать (отличный) ответ, опубликованный выше, вы можете получить значение цвета пикселя в .Net по этой ссылке MSDN пример


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться