2010-09-29 4 views
3

Nous sommes en train de créer une application simple pour manipulation d'image dans Silverlight, et nous avons rencontré un léger problème. Nous voulons que les utilisateurs puissent sélectionner une zone d'une image (soit en traçant une ligne à main levée autour de leur zone choisie ou en créant un polygone autour d'elle), puis être en mesure d'appliquer des effets aux pixels de cette sélection.Algorithme pour détecter si un pixel est dans une limite

Créer une sélection d'images est assez facile, mais nous voulons un algorithme très rapide pour décider quels pixels doivent être manipulés (quelque chose pour détecter quels pixels sont dans la sélection de l'utilisateur).

Nous avons pensé à trois possibilités jusqu'à présent, mais nous sommes sûrs qu'il doit y avoir un moyen vraiment efficace et rapide de faire cela, mieux que cela.

1. Pixel par pixel. Nous parcourons simplement chaque pixel d'une image et vérifions si elle appartient à la sélection de l'utilisateur. Évidemment, c'est trop lent!

2. Utilisation d'un algorithme de croisement de ligne. Le type de chose seen here.

3. Remplissage de remplissage. Sélectionnez les pixels le long du chemin de la sélection, puis effectuez un remplissage d'inondation dans cette sélection. Cela pourrait fonctionner correctement.

Cela doit être un problème qui est généralement résolu, donc nous supposons qu'il y a beaucoup plus de solutions que nous n'avons même pas pensé.

Que recommanderiez-vous?

+2

Voulez-vous quelque chose de plus rapide que O (n)? Est-ce qu'un Flood Fill intelligent est vraiment lent? –

+0

Etes-vous sûr que c'est vraiment un problème de performance? Je veux dire, même la peinture MS fait ce genre de chose assez rapidement (dessiner un polygone fermé rempli, ce qui est à peu près ce dont vous avez besoin). – korbes

+0

Vous devriez jeter un oeil à http://nokola.com/blog/?tag=/EasyPainter – Denis

Répondre

3

Vous devriez pouvoir utiliser votre polygone pour créer un tracé de détourage. Le mini-langage pour décrire les polygones pour Silverlight est très bien documenté.

Alter pixels sur une copie de l'image (tous les pixels est généralement facile à modifier que certains pixels), puis utilisez le chemin de détourage pour rendre seule la zone souhaitée des modifications à l'image d'origine (probablement en utilisant un bitmap tampon supplémentaire pour le résultat).

Espérons que cela aide. Juste jeter les idées et voir si n'importe quel bâton :)

Questions connexes