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 6 et antérieur Discussion :

Trouver l'emplacement d'un pixel unique par sa couleur


Sujet :

VB 6 et antérieur

  1. #1
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut Trouver l'emplacement d'un pixel unique par sa couleur
    Bonsoir.
    Comme dit dans le titre, j'ai une image (assez grande) et dans cette image, il y a un pixel (et un seul) qui a une couleur qu'aucun autre pixel n'a dans l'image. Je cherche a avoir ses coordonnées le plus rapidement possible. Je suis déjà capable de les avoir mais j'utilise une technique qui se trouve etre la plus simple mais aussi la plus lente: je regarde pixel par pixel.

  2. #2
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    Fait une recherche avec l'expression algorithme de recherche. Je suis en train de déménager... et contrairement à ce que j'avais annoncé, je n'ai pas encore débranché l'ordi... Mais les bouquins et notes de cours sont dans des boîtes...

  3. #3
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    J'ai la fièvre et te répond d'instinct, sans pouvoir essayer :

    Dans l'ordre :

    1) tu découpes en deux l'mage et obtiens donc 2 images
    2) sur la première moitié : instruction de changer cette couleur par une autre, par le procédé que tu connais maintenant (celui qui figure sur le zip avec oiseau que je t'ai fait parvenir il y a quelques jours)
    3) comparaison de l'image avant et après. si identiques le pixel n'est pas là et tu passes à la 2ème moitié. si différentes : le pixel est là et tu appliques à cette moitié là le même traitement que celui appliqué à l'image totale (tu decoupes cette moitié en 2 moitiés)

    etc.. etc...

    J'espère que tu me comprends...

    Au lieu de couper, tu peux penser à :
    copier vers une autre image la 1ère image puis, toujours avec le même raisonnement, traiter une moitié, comparer, etc... etc...

    Tu peux également jouer avec pictureClip


    Tu as compris, je pense, que lorsque tu as ainsi défini une zone de la taille raisonnablement réduite de ton choix, tu y fais une recherche pixel par pixel..pour trouver la position du pixel. Un caclcul arithmétique simple, en fonction du numéro de "découpage", devrait alors te permettre de déterminer quelle est la position sur l'image entière


    PS : en y pensant mieux : inutile de copier l'image originelle vers une autre !
    Tu traites de moitié en "moitié de moitié" comme expliqué plus haut et compares chaque fois le résultat avec l'image originelle (au préalable mémorisé). De cette façon : plus de nécessité de calcul arithmétique in fine, bien évidemment ... puisque tu connais ainsi directement la position réelle de ton pixel

  4. #4
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    Ok, alors après avoir buché pendant un moment j'ai finalement trouvé une autre solution que j'ai sortit de mon premier ocx (que l'on peut trouver avec ses sources sur mon site), celui-ci travaillait sur les images bitmap mais directement dans le fichier. je récupère le fichier dans une variable string, convertit la couleur en chaine d'octets, cherche cette chaine dans le fichier a l'aide de InStr, et trouve les coordonées X et Y en fonction de la place de la chaine dans le fichier. ca marche et c'est plutot rapide. voila ce que ca donne :

    A mettre dans un module :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Public Contenu As String
    Public RCompo As Byte
    Public GCompo As Byte
    Public BCompo As Byte
    Public TmpVar As Long
    Public ColorStr As String
    Public OctetPos As Long
    Public Varbyte As Byte
    Public Large As Single    'largeur de l'image
    Public Hauteur As Single  'Hauteur de l'image
    Public OctetLigne As Integer    'contient le nombre d'octet par ligne
     
    '======================================================================================
    '======================================================================================
     
    Public Sub InfosBmp(Adresse As String)
     
    Contenu = Space(FileLen(Adresse))
     
    Open Adresse For Binary As #1
    Get #1, , Contenu
     
    Get #1, 19, Varbyte      'recupère la premiere partie de la largeure
    Large = Varbyte
    Get #1, 20, Varbyte      'recupère la seconde partie
    Large = Large + Varbyte * 256
     
    Get #1, 23, Varbyte
    Hauteur = Varbyte
    Get #1, 24, Varbyte
    Hauteur = Hauteur + Varbyte * 256
     
    Close #1
     
        'Calcul le nombre d'octet par ligne
    OctetLigne = (FileLen(Adresse) - 54) / Hauteur
     
    End Sub
     
     
    '======================================================================================
    '======================================================================================
     
     
    Public Sub GetPixPos(PixColor As Long, PixX As Single, PixY As Single)
     
    BCompo = CByte(Int(PixColor / 65536))
        PixColor = PixColor - BCompo * 65536
    TmpVar = Int(PixColor / 256)
    GCompo = CByte(TmpVar)
    TmpVar = CLng(GCompo) * 256
        PixColor = PixColor - TmpVar
     
    RCompo = CByte(PixColor)
     
    ColorStr = Chr(BCompo) & Chr(GCompo) & Chr(RCompo)
     
    OctetPos = InStr(Contenu, ColorStr)
     
    If OctetPos <> 0 Then
     
        PixY = Int((OctetPos - 55) / OctetLigne)
     
        PixX = (OctetPos - 55 - OctetLigne * PixY) / 3
     
        PixY = Hauteur - PixY - 1
     
    Else
     
        PixX = -1
        PixY = -1
     
    End If
     
     
     
    End Sub
    recherche du pixel ayant pour couleur 500001 dans le fichier Bitmap
    C:\MonImage.bmp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim MaCouleur As Long
    Dim MonFichier As String
    Dim X As Single
    Dim Y As Single
     
    MonFichier = "C:\MonImage.bmp"
    MaCouleur = 500001
     
    InfosBmp MonFichier 'Ouvre le fichier
    GetPixPos MaCouleur, X, Y
    Les Coordonées sont dans X et Y, si le pixel n'existe pas on a X=-1 et Y=-1

  5. #5
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    Si vous avez quelque chose de plus rapide je suis quand même preneur

  6. #6
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    C'est bon, avigeilpro, c'est bon...

    Mais si tu divises "de deux en deux" ce sera encore plus rapide (essaye)

  7. #7
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    J'essaye ca dés ce soir, mais juste une petite question:
    pour copier une partie d'image : PaintPicture
    et pour comparer deux images ?

  8. #8
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Comparer 2 images est une méthode.

    Avec la tienne, qui n'est pas mal non plus, tu n'as nul besoin de comparer ! Ou tu "trouves" dans la première moitié ou tu ne trouves pas. Si tu trouves : tu travailles alors dans la moitié de la 1ère moitié etc... Si tu ne trouves pas, tu travailles dans la 1ère moitié de la 2ème moitié, etc...

    Le principe général est le même que celui appliqué pour la recherche d'un mot dans un dictionnaire... (16 gestes au maximum...)

  9. #9
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    Ok, je regarde ca ce soir.
    Bonne après-midi

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

Discussions similaires

  1. Trouver l'emplacement d'un fichier
    Par seiryujay dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 16/12/2005, 10h55
  2. Couleur du pixel pointé par la sourie
    Par algerian dans le forum Windows
    Réponses: 4
    Dernier message: 16/08/2005, 18h22
  3. Réponses: 8
    Dernier message: 08/06/2004, 01h29
  4. Trouver l'emplacement de la machine virtuelle java
    Par aymron dans le forum Windows
    Réponses: 2
    Dernier message: 30/03/2004, 12h11
  5. créer un ID unique par incrementation
    Par Jcdas dans le forum Access
    Réponses: 6
    Dernier message: 23/12/2003, 13h55

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