94 votes

Convertir RGBA couleur de RVB

Comment faire pour convertir une couleur RVBA tuple, exemple (96, 96, 96, 202), correspondant à la couleur de RVB tuple?

Edit:

Ce que je veux est d'obtenir une valeur RVB qui est le plus semblable à la RGBA tuple visuellement sur fond blanc.

103voto

Andras Zoltan Points 24996

J'ai upvoted Johannes de réponse parce qu'il a raison à ce sujet.

Plus de réponse spécifique, cependant, intègre la valeur alpha dans la couleur réelle résultat basé sur un arrière-plan opaque de couleur (ou " mat " comme il l'appelle).

Par exemple, en Supposant que 0 est opaque et 255 est transparent, alors 255,255,255,127 RGBA avec un noir mat entraînera 127,127,127 valeur RVB.

Il existe un algorithme pour ce (à partir de ce lien wikipédia):

  • Normaliser les valeurs RGBA de sorte qu'ils sont tous compris entre 0 et 1 - il suffit de diviser chaque valeur de 255 pour ce faire. Nous allons appeler le résultat Source.
  • Normaliser également la matte de couleur (noir, blanc quoi que ce soit). Nous allons appeler le résultat BGColor
  • Maintenant, la conversion est définie comme (à compléter pseudo code ici!):

    Source => Target = (BGColor + Source) =
    Target.R = ((1 - Source.A) * Source.R) + (Source.A * BGColor.R)
    Target.G = ((1 - Source.A) * Source.G) + (Source.A * BGColor.G)
    Target.B = ((1 - Source.A) * Source.B) + (Source.A * BGColor.B)
    

Pour obtenir la valeur finale de 0 à 255 valeurs de Target vous suffit de multiplier toutes les valeurs normalisées de back up 255, assurez-vous de la pac à 255 si l'une des valeurs combinées dépasser 1,0 (c'est de la sur-exposition et il existe des algorithmes plus complexes traitant de ce qui impliquent l'ensemble du traitement de l'image, etc.).

EDIT: Dans votre question, vous avez dit que vous voulez un fond blanc, dans ce cas il suffit de fixer BGColor à 255,255,255.

45voto

hkurabko Points 231

hm... quant à

http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending

la solution fournie par Andras Zoltan devrait être légèrement modifiée:

Source => Target = (BGColor + Source) =
Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R)
Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G)
Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)

Cette version modifiée fonctionne très bien pour moi, parce que dans le précédent. version rgba(0,0,0,0) avec de la matte rgb(ff,ff,ff) sera modifié pour rgb(0,0,0).

7voto

kusma Points 3719

Cela dépend de l'espace de couleur que vous utilisez. Si la LED est en pré-multiplié espace de couleurs et sont semi-transparents, vous devez diviser la sortie de l'alpha pour obtenir la bonne couleur RVB. Si la couleur n'est pas en pré-multiplié couleur-espace, alors vous pouvez simplement jeter le canal alpha.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X