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

Допустим, у нас есть цвет 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?

Я просто хочу сказать, что мне приятно, что "Light Urple" пережил 4 редактирования.

Matt Dawdy 12.09.2017 06:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
24
1
12 565
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

В псевдокоде предполагается, что цвет фона (смешение) всегда имеет 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()

примечание: вам, вероятно, нужно быть немного (более) осторожным в вопросах математики с плавающей запятой / int и округления, в зависимости от языка. Соответственно использовать промежуточные звенья

Отредактировано для добавления:

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

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

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

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

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

Я знаю, что это старый поток, но хочу добавить следующее:

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));
}

Другие вопросы по теме