Pergunta

A cor de fundo exato é conhecido.

Imagine um tipo de letra anti-aliasing em um fundo verde. Agora, queremos mudar a cor da imagem de fundo para vermelho.

Então .. Como faço para extrair a parte "não-fundo" da cor de um pixel e adicioná-lo (ou "blend") no topo de uma outra cor bg depois?

Sabemos também a cor da fonte, por isso sabemos que pixels são totalmente opaco.

Foi útil?

Solução

Cada pixel na imagem é a cor de fundo, a cor da fonte, ou alguma mistura dos dois. Então você pode especificar toda a imagem com os valores RGB de fundo, os valores RGB de fonte e uma matriz de valores entre 0 e 1, onde, digamos, 0 significa que o pixel é a cor de fundo, 1 significa que o pixel é a cor da fonte. Um valor como 0,1 significa que o pixel é principalmente cor de fundo com um pouco de cor da fonte, etc.

Uma expressão como:

blend_value = ((pixel.R - bg.R) / (font.R - bg.R)
              + (pixel.G - bg.G) / (font.G - bg.G)
              + (pixel.B - bg.B) / (font.B - bg.B)) / 3

lhe dará esses valores para qualquer pixel da imagem. Para construir os novos valores RGB usando uma nova cor de fundo, você usa esse valor para misturar a cor da fonte com a nova cor de fundo.

new_pixel.R = blend_value * font.R + (1 - blend_value) * new_bg.R
new_pixel.G = blend_value * font.G + (1 - blend_value) * new_bg.G
new_pixel.B = blend_value * font.B + (1 - blend_value) * new_bg.B
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top