2008-09-20 5 views
5

Je dois placer une bordure dégradée alpha autour d'une image. Mon problème est de mélanger les coins afin qu'ils soient lisses là où les gradients horizontaux et verticaux se rencontrent. Je crois qu'il existe un algorithme standard qui résout ce problème. Je pense que je l'ai même rencontré à l'école il y a plusieurs années. Mais je n'ai pas réussi à trouver une référence à une dans plusieurs recherches sur le Web.Algorithme pour mélanger les coins remplis de dégradé dans l'image

(j'ai mis en œuvre un motif de remplissage radial dans le coin, mais la transition est toujours pas assez lisse.)

Mes questions:

  1. S'il existe un algorithme standard pour ce problème, quel est le nom de , et encore mieux, comment est-il mis en œuvre?

  2. Renoncer tout algorithme standard, quelle est la meilleure façon de déterminer la valeur pixel souhaitée pour produire un gradient lisse dans les coins? (Faire une transition en douceur du gradient vertical au gradient horizontal .)

EDIT: Alors, imaginez que j'ai une image que je vais insérer sur le dessus d'une image plus grande. L'image la plus grande est en noir et l'image la plus petite est en blanc uni. Avant de l'insérer, je souhaite fusionner l'image la plus petite dans la plus grande image en définissant la valeur alpha sur l'image la plus petite afin de créer une "bordure" transparente autour de celle-ci afin qu'elle "disparaisse" dans l'image agrandie. Fait correctement, je devrais avoir un dégradé lisse du noir au blanc, et je le fais partout sauf les coins et le bord intérieur.

Au bord de la bordure du dégradé près du centre de l'image, la valeur est 255 (non transparent). Lorsque la bordure se rapproche du bord extérieur, la valeur alpha approche 0. Dans les coins de l'image où les bordures horizontales se rejoignent, vous obtenez ce qui équivaut à une ligne diagonale. Je veux éliminer cette ligne et avoir une transition en douceur. Ce dont j'ai besoin, c'est d'un algorithme qui détermine la valeur alpha (0 - 255) pour chaque pixel qui se chevauche dans le coin d'une image lorsque les bords horizontaux et verticaux se rencontrent.

Répondre

2

Vraisemblablement, vous multipliez les deux dégradés où ils se chevauchent, non?

Donne un nom d'algorithme standard. Mais si vous utilisez un dégradé en forme de signoïde au lieu d'un dégradé linéaire, cela devrait éliminer le bord visible où les deux se chevauchent.

Une fonction simple sigmoïde est smoothstep (t) = t t (3 - 2 * t) où 0 = < t < = 1

+0

Cela semble prometteur. Je ne suis pas sûr que je veux jouer avec XNA (Ceci est une application C# et je pense que XNA est le meilleur (seulement?) mais je suis en train de faire un test maintenant et je déciderai si je veux l'utiliser ou bien lancer le mien en fonction des résultats. – TMarshall

+0

Smoothstep est juste la fonction (très simple) que j'ai décrite; il a été autour pour yonks et n'est pas exclusif à XNA. –

+0

Je viens de faire une implémentation - bien que cela rende les dégradés plus agréables, les coins ont le même problème. Le vrai problème est l'illusion d'optique créée par les gradients. Il n'y a pas d '"erreur" pour le linéaire ou le smoothstep, mais vous "voyez" toujours une ligne sauf si vous bloquez la réinitialisation du dégradé de votre vision. –

0

Si vous n'avez pas besoin d'être redimensionnable, vous pouvez simplement utiliser une simple carte alpha.

Cependant, j'ai utilisé un simple fondu gaussien, avec la moyenne à l'endroit où je voulais que ce soit les derniers pixels totalement opaques. Si ça a du sens.

Questions connexes