2010-06-28 6 views
1

J'ai, à titre d'exemple, les deux images suivantes:Traitement d'image - définir des sélections à partir d'une image source

http://img571.imageshack.us/i/spain.jpg/
http://img97.imageshack.us/i/spainoverlay.png/

Je veux charger le second et détecter les zones transparentes pour une utilisation comme sélections auxquelles je peux appliquer un traitement, mais je n'ai pas la première idée comment commencer. Je suis habitué à charger des images et à dessiner des formes et du texte dessus, mais c'est à peu près tout.

Comment effectuer une sorte de détection de "baguette magique" sur les zones transparentes pour obtenir une série de points ou d'autres définitions de la zone à manipuler? Editer: Dans la deuxième image, les zones blanches sont en fait les zones transparentes. Ils apparaissent blancs grâce à la couleur de fond d'imageshack.

Répondre

1

Cela semble comme un simple problème de seulement afficher l'image complète de la carte, et la cartographie du curseur de coordonnées lors de son déplacement sur cette image à la coordonnée correspondante de l'image de masque. Vous pourriez faire deux choses ici. Gardez l'image du masque en noir et blanc et disposez d'une carte de chaque zone associée à quelque chose qui définit ce que vous voulez faire lorsque cette zone est survolée. Ou, changez votre masque en une image multicolore, et faites simplement correspondre chaque code couleur à quelque chose qui définit ce que vous voulez faire lorsque cette zone est survolée. Personnellement, je choisirais ce dernier, car il est beaucoup plus simple, et vous auriez environ 16 millions de zones possibles qui pourraient être utilisées (en 24 couleurs).

Etant donné un type de cartographie simple:

class ZoneMap 
{ 
    public Color MappedColor { get; set; } 
    public Action OnHover { get; set; } 
} 

Vous pourriez regarder la zone cartographiée en traduisant les coordonnées de la souris de l'image source aux coordonnées correspondantes de l'image de carte des zones multi-couleurs, rechercher le ZoneMap entrée par couleur, et invoquer son action OnHover:

var spainZones = new ZoneMap[] 
{ 
    new ZoneMap { MappedColor = Color.Red, OnHover = new Action(RedHandler) }, 
    new ZoneMap { MappedColor = Color.Blue, OnHover = new Action(BlueHandler) } 
} 

var color = getZoneColor(Mouse.X, Mouse.Y); // translate source mouse coords to colored zone map coords and get color 
var zone = spainZones.FirstOrDefault(zm => zm.MappedColor == color); 

zone.OnHover(); 

Je sais que c'est très difficile. Si j'avais plus d'informations sur ce que vous voulez faire en stationnaire d'une zone particulière, je pourrais être en mesure de fournir plus.

+0

Ceci est proche de ce que je veux, je pense. L'idée de base est de traiter distinctement les différentes zones (pensez à des pièces de puzzle). Le résultat final est quelque chose comme la façon dont warfish.net fait avec ses cartes de jeu. Je veux présenter l'image originale à l'utilisateur, détecter un clic et faire quelque chose avec tous les pixels adjacents de la même couleur (remplir la zone avec une couleur, par exemple) – Chris

+0

En utilisant des pixels adjacents de la même couleur selon la superposition, je signifier. L'image source originale est uniquement à des fins de présentation - l'intention est que la superposition définisse les zones d'action de l'image. – Chris

+0

@Chris: À droite, seule l'image source d'origine serait affichée. Cependant, tant que votre image source et l'image de la carte de zone ont la même taille, vous pouvez facilement mapper les coordonnées de la souris lorsque vous passez la souris sur l'image source vers l'image de la carte de zone. Une fois que vous avez la couleur de la zone, rechercher l'entrée ZoneMap correcte par couleur et invoquer son action OnHover serait plutôt trivial. – jrista

0

Vous pouvez vérifier si un pixel est transparent en vérifiant sa valeur alpha (0 est entièrement transparent, 255 est complètement opaque) avec Bitmap.GetPixel(), si les objets Bitmap sont ce que vous utilisez pour charger les images.

Si vous avez juste besoin de faire quelque chose avec chaque pixel transparent, je suppose qu'il n'est pas nécessaire de créer une sélection dans un objet séparé. Juste itérer à travers les pixels, si l'on est transparent, faites ce que vous avez à faire.

Si vous devez créer une sélection, vous pouvez utiliser une image bitmap séparée de 1 bit par pixel de la même taille que votre image d'origine. Le blanc représente la zone sélectionnée, le noir n'est pas sélectionné (ou le contraire, votre choix).

Voir: http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx

Questions connexes