IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB.NET] Comment remplacer une couleur par une autre?


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut [VB.NET] Comment remplacer une couleur par une autre?
    Bonjour,

    J'ai absolument besoin de remplacer une couleur par une autre, de manière rapide!
    J'ai essayé avec 2 boucle for imbriqué, permettant de passer chaque pixels en revue un à un (grâce aux méthodes "SetPixel" et "GetPixel") mais ça n'est ps du tout assez instantanné!

    Pourtant sous paint, ou photoshop, si tu cliques sur ton pot de peinture, pour remplacer le bleue par du rouge, ben c'est direct...

    Comment fait on celà?

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Salut,

    L'utilisation du pot de peinture sous Paint est très rapide car il y a au préalable un clic sur une zone, et donc on peut dérouler un algoritme de detection de zone, pour remplacer tous les bons pixels; la recherche ne se fait que sur les pixels concernés.

    Maintenant, remplacer une couleur dans toute une image, c'est une autre histoire ! Je n'ai pas d'algorithme préci en tête pour cette tache, mais je te conseille de poser ta question sur le forum dédié aux algorithmes. La detection de zones et de contours pourraient aider dans cette tache, mais je n'ai pas envie de t'induire en erreur avec des algorithmes qui ne seraient pas "standard" pour ce genre de tache ( je ne suis pas suffisament forts en algorithmes de traitements des images )

    A+
    K

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    L'utilisation du pot de peinture sous Paint est très rapide car il y a au préalable un clic sur une zone
    Ben en fait même pas, sous paint tu n'as pas besoin de cliquer, ou de sélectionner une zone pour remplacer une couleur. Tu prend ton pot de peinture, et tu clikes sur un endroit bleue par exemple, et ça remplace le bleue. Sans préselection.

    En tout cas je vois par ta réponse que ma question n'est pas évidente Et qu'il est possible qu'il faille faire appel à des algorhytme de programmation, pour déterminer des zones, des régions etc etc
    C'est un peu ce qu'il y a dans le code que j'ai trouvé en VB6.. mais arrive pas à le passer en vb.net...

  4. #4
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Rien que le fait de cliquer sur un pixel, correspond à la selection d'une zone, chose qui peut grandement améliorer la recherche de pixel contigus de la même couleur C'était ce que je voulais dire. En comparaison, remplacer une même couleur dans toute l'image, est forcément plus lent. Sauf si tu as en quelque sorte déjà prémaché le travail, ce que l'étude des contours/zones permet de faire.
    K

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Il faut utiliser ImageAttributes
    En particulier ImageAttributes.SetRemapTable() qui permet de remplacer une couleur par une autre au rendu d'une image par Graphics.DrawImage()
    On ne peut pas faire boire un âne qui n'a pas soif.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Merci NicolasG! Celà marche! ça a été difficile, mais ça a fini par marcher! On peut donc modifier une couleur d'une image en quelques lignes, et ce TRES rapidement!

    Voici le code commenté du mieux que j'ai pû, il permet de redimensionner une image selon la taille du contrôle et de la mélanger à une autre tout en changeant la couleur transparent de cette derniere en Magenta:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    	'Création d'un Graphics pour travailler sur l'image "Peinture" 
    	Dim PeintureGraphics As Graphics = Graphics.FromImage(Peinture) 
     
    	'Ouverture de l'image désiré à mélanger 
    	Dim PNG As Bitmap = Image.FromFile("C:\losange transparent.png")
     
    	'Création d'une Bitmap à la taille du contrôle 
    	Dim PNGRetail As Bitmap = New Bitmap(Me.Width,Me.Height) 
     
    	'Création d'un mappage Transparent -> Magenta! 
    	Dim map(0) As System.Drawing.Imaging.ColorMap 
    	map(0) = New System.Drawing.Imaging.ColorMap() 
    	map(0).OldColor = Color.FromArgb(0,0,0,0) 
    	map(0).NewColor = Color.Magenta 
     
    	'Création d'attributs d'image, avec le mappage créer juste avant comme contenu 
    	Dim myAttributs As New ImageAttributes() 
    	myAttributs.SetRemapTable(map) 
     
    	'Je créé un Graphics pour travailler sur la Bitmap PNGRetail
    	Dim PNGraphics As Graphics = Graphics.FromImage(PNGRetail) 
     
    	'Ce rectangle me servira apres pour dire à quel endroit placer l'image dans l'image "Peinture" 
    	Dim Rect As New Rectangle(0,0,Me.Width,Me.Height) 
     
    	'Je redimensionne l'image PNG à la taille de la PNGRetail 
    	PNGraphics.DrawImage(PNG,0,0,Me.width,Me.Height) 
     
    	'Je postionne l'image "PNGRetail" dans l'image "Peinture", en changeant sa couleur transparente en Magenta, et en la positionnant à l'emplacement décrit par "Rect" 
    	PeintureGraphics.DrawImage(PNGRetail,Rect,0,0,Me.Width,Me.Height,GraphicsUnit.Pixel,myAttributs) 
     
    	'Enregistrer la nouvelle image ;) 
    	Peinture.Save("c:\peinture.png")
    Ca marche super bien! et c'est super rapide!
    A bon entendeur

    EDIT: La méthode "DrawImage" de la Class "Graphics" peut comporter différents nombre d'arguments. Elle existe dans de nombreuses formes différentes. Voir MSDN pour s'y retrouver ici: http://msdn.microsoft.com/library/fr...imagetopic.asp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/06/2009, 00h26
  2. Remplacer une couleur par une autre couleur
    Par brice01 dans le forum SDL
    Réponses: 6
    Dernier message: 25/02/2007, 16h38
  3. Réponses: 10
    Dernier message: 20/09/2006, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo