Share via


Valeurs alpha prémultipliées

Dans l’infographie, 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 d’une ligne droite, également appelée linéaire, alpha :

  • Les valeurs RVB spécifient la couleur de la chose en cours de dessin
  • La valeur alpha spécifie à quel point elle est solide

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

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 quantité de couleur que la chose dessinée contribue à la sortie
  • La valeur alpha spécifie combien 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 apporter moins de couleur) et aussi son alpha (pour masquer moins ce qui se trouve derrière lui). Les objets entièrement transparents n’ayant plus de couleur du tout, il n’y a qu’une seule valeur qui représente 100 % de transparence : RVB et alpha tout 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ée est utilisée dans le rendu graphique, car elle donne de meilleurs résultats que l’alpha droite lors du filtrage d’images ou de la composition de différentes couches. Pour plus d’informations, consultez les articles suivants :

Alpha dans Win2D

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

Windows.UI.Color les valeurs utilisent l’alpha droite. Chaque fois que vous passez une couleur à une Draw* méthode ou , Fill* 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 droite.

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

Les effets d’image Win2D utilisent un mélange d’alpha droite et prémultiplié. Certains effets fonctionnent sur un format, d’autres sur l’autre, et d’autres 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 une valeur alpha droite, il applique d’abord une transformation non prémultiply, calcule l’effet, puis prémultipère la sortie.

Les API GetPixelBytesbitmap , SetPixelBytes, GetPixelColorset SetPixelColors, n’effectuent aucune conversion au format alpha. Ils transfèrent simplement directement les valeurs de bits vers ou à partir de la texture GPU sous-jacente. Cela vous permet d’observer le format alpha utilisé par Win2D 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 au format prémultiplié, avec R = 0, G = 0, B = 0, A = 0
  • Utiliser GetPixelColors pour 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 d’un format alpha à l’autre

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

Notez que les informations de couleur sont souvent représentées sous forme de valeurs d’octets comprises entre 0 et 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, de sorte qu’une valeur d’octet de 255 signifie en fait 1, tandis que 128 est une demi-intensité. Ce facteur de mise à l’échelle doit être pris en compte lors des conversions de format. Par conséquent, pour convertir un Windows.UI.Color de droit en 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 un format alpha incorrect ou PremultiplyEffectUnPremultiplyEffect qui peuvent être utilisées pour les convertir.