Partager via


Valeurs alpha prémultipliées

Dans les graphiques informatiques, il existe deux façons différentes de représenter l’opacité d’une valeur de couleur. Win2D utilise les deux méthodes. Cet article explique la différence, et qui est utilisé où.

Alpha droit

Lors de l’utilisation droite, également appelée linéaire, alpha :

  • Les valeurs RVB spécifient la couleur de la chose dessinée
  • La valeur alpha spécifie comment elle est solide

Dans ce monde, RVB et alpha sont indépendants. Vous pouvez en changer un sans affecter l’autre. Pour faire disparaître un objet, vous réduisez progressivement sa valeur alpha tout en laissant RVB inchangée.

Pour effectuer un mélange source-over entre deux couleurs qui utilisent le format alpha droit :

result = (source.RGB * source.A) + (dest.RGB * (1 - source.A))

Valeurs alpha prémultipliées

Lors de l’utilisation de l’alpha prémultipliée :

  • RVB spécifie la couleur de la chose dessinée contribue à la sortie
  • La valeur alpha spécifie la quantité qu’elle masque ce qui se trouve derrière elle

Dans ce monde, RVB et alpha sont liés. Pour rendre un objet transparent, vous devez réduire à la fois son RVB (pour contribuer moins de couleur) et son alpha (pour masquer moins de ce qui est derrière elle). Les objets entièrement transparents n’ont plus de couleur du tout, il n’y a donc qu’une seule valeur qui représente une transparence de 100 % : RVB et alpha toutes zéro.

Pour effectuer un mélange source-over entre deux couleurs qui utilisent le format alpha prémultiplié :

result = source.RGB + (dest.RGB * (1 - source.A))

L’alpha prémultiplié est utilisé dans le rendu graphique, car il donne de meilleurs résultats que l’alpha droit lors du filtrage d’images ou de la composition de différentes couches. Pour plus d’informations, consultez les billets de blog suivants :

Alpha dans Win2D

Win2D utilise l’alpha droite dans sa surface d’API, mais prémultipliée alpha pour les opérations de rendu internes.

Windows.UI.Color les valeurs utilisent des valeurs alpha droites. Chaque fois que vous passez une couleur à une Draw* ou Fill* une méthode, définissez la couleur d’un pinceau ou effacez sur une valeur de couleur, cette couleur est spécifiée à l’aide de l’alpha droit.

Les valeurs de pixels stockées dans une image bitmap ou rendertarget, ainsi que les opérations de dessin ou de fusion qui fonctionnent sur ces surfaces, utilisent l’alpha prémultipliée. Lorsque des bitmaps sont chargées à partir d’un fichier, leur contenu est automatiquement converti en format prémultiplié. Lorsque vous appelez une méthode de dessin Win2D, son paramètre de couleur est converti de droite en prémultiplié avant que le dessin réel ne se produise.

Les effets d’image Win2D utilisent un mélange d’alpha droites et prémultipliées. Certains effets fonctionnent sur un format, certains sur l’autre, et certains fournissent une propriété à choisir. La documentation de chaque type d’effet décrit le mode alpha qu’il utilise. Les données d’entrée d’effet sont toujours supposées être prémultipliées. Par conséquent, lorsqu’un effet doit fonctionner avec l’alpha droit, il applique d’abord une transformation non optimisée, calcule l’effet, puis remultiply la sortie.

Les API GetPixelBytesbitmap , , SetPixelBytesGetPixelColorset SetPixelColors, n’effectuent aucune conversion de format alpha. Ils transfèrent directement des valeurs de bits vers ou depuis la texture GPU sous-jacente. Cela vous permet d’observer le format alpha que Win2D utilise en interne :

  • Créer une session de dessin sur un rendertarget
  • Appelez drawingSession.Clear(Colors.Tranparent)
  • Colors.Tranparent est défini comme R = 255, G = 255, B = 255, A = 0
  • Win2D convertit cette valeur en format prémultiplié, en produisant R = 0, G = 0, B = 0, A = 0
  • Permet GetPixelColors de lire le contenu du rendertarget
  • Notez qu’il contient le format prémultiplié RVB = 0, et non RVB = 255 comme la valeur alpha Colors.Tranparent droite d’origine

Conversion entre les formats alpha

Pour convertir une valeur de couleur alpha droite au format prémultiplié, multipliez ses valeurs R, G et B par A. Pour convertir prémultiplié en droite, divisez R, G et B par A.

Notez que les informations de couleur sont souvent représentées sous forme de valeurs d’octet allant de 0 à 255 (par exemple, la Windows.UI.Color structure se compose de 4 octets). Cette représentation est mise à l’échelle par un facteur de 255, donc une valeur d’octet de 255 signifie réellement 1, tandis que 128 est demi-intensité. Ce facteur de mise à l’échelle doit être pris en compte pendant les conversions de format, afin de convertir un Windows.UI.Color facteur de droite à prémultiplié :

premultiplied.R = (byte)(straight.R * straight.A / 255);
premultiplied.G = (byte)(straight.G * straight.A / 255);
premultiplied.B = (byte)(straight.B * straight.A / 255);
premultiplied.A = straight.A;

Si vous avez des données d’image qui utilisent le format alpha incorrect ou PremultiplyEffect UnPremultiplyEffect que vous pouvez l’utiliser pour la convertir.