A conversão de ARBG para RGB com alpha blending
Pergunta
Vamos dizer que temos um ARGB cor:
Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.
Quando esta é aplicada em cima de uma cor, as cores irão se misturar.Então, quando ele é misturado com o branco, a cor resultante é Color.FromARGB(255, 162, 133, 255);
A solução deve funcionar assim:
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);
O que é ToRGB
's a implementação?
Solução
É chamado de alpha blending.
Em psuedocode, assumindo a cor do plano de fundo (mistura) sempre tem 255 alfa.Também pressupõe o alfa é de 0 a 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()
nota:você provavelmente terá que ser um pouco (mais) cuidado com ponto flutuante/int matemática e problemas de arredondamento, dependendo do idioma.Elenco intermediários de acordo
Editado para acrescentar:
Se você não tem uma cor de fundo com um alfa de 255, a álgebra fica muito mais complicado.Já fiz isso antes e é um exercício divertido deixamos para o leitor (se você realmente precisa saber, fazer outra pergunta :).
Em outras palavras, qual a cor C combina em algum fundo o mesmo que o entremesclar, em seguida, misturando-B.Esta é uma espécie de como calcular A+B (o que não é o mesmo que B+A).
Outras dicas
Eu sei que essa é uma velha discussão, mas quero adicionar este:
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));
}
se você não precisa de conhecer este pré-renderização, você sempre pode usar o win32 método getpixel, eu acredito.
Nota:digitar no iPhone no meio do Missouri, sem inet de acesso.Vai procurar a real win32 exemplo e ver se há um .líquido equivalente.
No caso de alguém se importa e não quer usar o (excelente) resposta postada acima, você pode obter o valor de cor de um pixel .Net através deste link Exemplo do MSDN