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 :

Position d'un pixel en unité-pixel ou en twip


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    sdx
    sdx est déconnecté
    Membre confirmé Avatar de sdx
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 106
    Par défaut Position d'un pixel en unité-pixel ou en twip
    Bonjour,


    je souhaite récupérer les composantes R,G,B des pixels d'une form (dans le but de récupérer celles d'une image, que je charge en image de fond).

    Mon programme semblait fonctionner en utilisant POINT(X,Y).

    J'ai pensé malin de passer tous les paramètres de mesure en "Pixel" à la place du "Twip". Cependant, j'observe des distorsions entre mon image et les valeurs récupérées.

    En passant en Twip, je n'ai pas l'impression que cela fonctionne mieux. J'ai essayé de bricoler avec la multiplication par 15 pour passer twip->pixel.

    Dois-je utiliser une autre méthode ? (j'ai entendu parlé de GetPixel, et d'API windows, mais ça me semble bien compliqué pour un problème simple)


    Quelqu'un aurait une solution miracle ? twip ou pixel ? quelle fonction pour que ça marche bien ?

    merci beaucoup

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    la méthode Point retourne un long correspondant aux coordonnées X et Y d'un point de ta Form, coordonnées exprimées en unités qui sont définies par la propriété ScaleMode de ta Form.
    Je ne vois donc pas où est ton problème, à moins que ce ne soit finalement une erreur de conversion (et c'est alors toute autre chose) du long retourné en ses composantes RGB !!...

  3. #3
    sdx
    sdx est déconnecté
    Membre confirmé Avatar de sdx
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 106
    Par défaut
    merci ucfoutu.

    c'est bien ce qui je pensais en codant mon programme, et aujourd'hui ça marche ^^ j'ai remplacé un contrôle "picture" par une image de fond de la form définie avec "me.picture", et ça me donne les valeurs que j'attendais.


    Soit il y avait une fourberie qq part, soit c'est moi qui avait fait une boulette (et c'est tout à fait possible)


    en tout cas, tu as raison, et ça fonctionne avec ça


    merci beaucoup

    a+


    ps: par contre, j'ai encore quelques petites blagues de VB : un pixel (0,0,200) sous paint sort (0,0,208) ou (0,0,216) sous vb, mais c'est pas bien méchant ...

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Il n'y a aucune raison pour que VB te donne un autre résultat que Paint pour le même pixel !
    Tu dois à mon avis te tromper d'un pixel.
    As-tu bien compris que le 1er pixel est en coordonnées 0,0 et non 1,1 ?
    Je n'ai jamais eu (et j'ai très longtemps travaillé sur des bitmaps... et de manière avancée...) à noter ce dont tu parles !

    En ce qui concerne maintenant les scalemodes et les manières de t'en sortir quel que soit le scalemode, je t'ai préparé à toutes fins un petit exemple auto-explicite :

    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
    Private Sub Form_Activate()
      'Me.AutoRedraw = True
      Me.ScaleMode = vbPixels ' ici, je dessine en pixels (exemple)
      For i = 1 To 100
        Me.PSet (i, 10), vbGreen
      Next
      Me.PSet (101, 10), vbBlack ' seul ce point est dessiné en noir, donc ....
      For i = 102 To 300
        Me.PSet (i, 10), vbGreen
      Next
    End Sub
     
     
    Private Sub Command1_Click()
      Me.ScaleMode = vbPixels ' si je veux  tout traiter en pixels
      MsgBox Point(101, 10) & "  " & IIf(Point(101, 10) = vbBlack, "noir", "vert")
    End Sub
     
    Private Sub Command2_Click()
      'Me.AutoRedraw = True
      Me.ScaleMode = vbTwips ' etr je vais donc tout transformer en twips, puisque mon échelle est maintenant en txips
      MsgBox "le point juste avant est " & IIf(Point(100 * Screen.TwipsPerPixelX, 10 * Screen.TwipsPerPixelY) = vbBlack, "noir", "vert")
      MsgBox "le point lui-même est " & IIf(Point(101 * Screen.TwipsPerPixelX, 10 * Screen.TwipsPerPixelY) = vbBlack, "noir", "vert")
      MsgBox "le point juste après est " & IIf(Point(102 * Screen.TwipsPerPixelX, 10 * Screen.TwipsPerPixelY) = vbBlack, "noir", "vert")
      'on pourrait d'ailleurs utiliser directement les fonction ScaleX et ScaleY
      ' la preuve :
      MsgBox "le point lui-même est " & IIf(Point(Me.ScaleX(101, vbPixels, Me.ScaleMode), Me.ScaleY(10, vbPixels, Me.ScaleMode)) = vbBlack, "noir", "vert")
    End Sub

  5. #5
    sdx
    sdx est déconnecté
    Membre confirmé Avatar de sdx
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 106
    Par défaut
    Bonjour!

    Tu as raison, c'est quand même étrange !

    Pour être sûr de ce que je faisais, j'ai créé une image toute simple ayant cette structure :

    ligne 0 : pixels (0 , 0 , 0 )
    ligne 1 : pixels (200, 0 , 0 )
    ligne 2 : pixels (0 , 200, 0 )
    ligne 3 : pixels (200, 200, 0 )
    ligne 4 : pixels (0 , 0 , 200)
    ligne 5 : pixels (200, 0 , 200)
    ligne 6 : pixels (0 , 200, 200)
    ligne 7 : pixels (200, 200, 200)

    mon bmp est là :

    j'ai vérifié les couleurs avec GIMP, il donne les mêmes.


    Mon programme me donne

    - pour le rouge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TM[0] := matrix(8, 8, [
          [0,0,0,0,0,0,0,0],
          [208,208,208,208,208,208,208,208],
          [0,0,0,0,0,0,0,0],
          [208,208,208,208,208,208,208,208],
          [0,0,0,0,0,0,0,0],
          [208,208,208,208,208,208,208,208],
          [0,0,0,0,0,0,0,0],
          [208,208,208,208,208,208,208,208] ]):
    - pour le vert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TM[0] := matrix(8, 8, [
          [0,0,0,0,0,0,0,0],
          [0,0,0,0,0,0,0,0],
          [204,204,204,204,204,204,204,204],
          [204,204,204,204,204,204,204,204],
          [0,0,0,0,0,0,0,0],
          [0,0,0,0,0,0,0,0],
          [204,204,204,204,204,204,204,204],
          [204,204,204,204,204,204,204,204] ]):
    - pour le bleu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TM[0] := matrix(8, 8, [
          [0,0,0,0,0,0,0,0],
          [0,0,0,0,0,0,0,0],
          [0,0,0,0,0,0,0,0],
          [0,0,0,0,0,0,0,0],
          [208,208,208,208,208,208,208,208],
          [208,208,208,208,208,208,208,208],
          [208,208,208,208,208,208,208,208],
          [208,208,208,208,208,208,208,208] ]):

    Alors la seule explication qui me reste, c'est la récupération des valeurs R,G,B.
    J'utilise ça, dites-moi que je ne me suis pas planté ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    p = frmImg.Point(i * 8 + X, j * 8 + Y)
     
    r = p Mod 256: p = Int(p / 256)
    g = p Mod 256: p = Int(p / 256)
    b = p
    J'ai pourtant essayé de faire bien attention à tout ...
    Si quelqu'un voit où je me suis planté


    merci !

  6. #6
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Bonjour,
    Citation Envoyé par sdx Voir le message
    .../...
    Alors la seule explication qui me reste, c'est la récupération des valeurs R,G,B.
    J'utilise ça, dites-moi que je ne me suis pas planté ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    p = frmImg.Point(i * 8 + X, j * 8 + Y)
     
    r = p Mod 256: p = Int(p / 256)
    g = p Mod 256: p = Int(p / 256)
    b = p
    J'ai pourtant essayé de faire bien attention à tout ...
    Si quelqu'un voit où je me suis planté


    merci !
    Je n'ai rien vérifié mais concernant la récupération des valeurs RGB : pas glop, pas glop ...
    r=g ?

    Une autre méthode à mon sens plus «esthétique» :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    B= val("&h" & mid(format(hex(p),"\&\H000000"),1,2))
    G= val("&h" & mid(format(hex(p),"\&\H000000"),3,2))
    V= val("&h" & mid(format(hex(p),"\&\H000000"),5,2))
    Par contre, pour une grande quantité à extraire, je ne suis pas convaincu que cette méthode soit la plus rapide.

    Sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    R=p mod 256
    p=p\256
    G=p mod 256
    V= p\256

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

Discussions similaires

  1. Transformer des pixels blancs en pixels transparents
    Par michaeljeru dans le forum 2D
    Réponses: 1
    Dernier message: 11/03/2012, 10h35
  2. TRichEdit position fonction de x et y (pixels)
    Par Speed41 dans le forum Débuter
    Réponses: 7
    Dernier message: 28/12/2010, 20h16
  3. Pixels adjacents dans pixel shader
    Par ultimanu dans le forum DirectX
    Réponses: 5
    Dernier message: 24/04/2007, 13h31
  4. pixels ou demi pixel ?
    Par rafale001 dans le forum SDL
    Réponses: 9
    Dernier message: 03/03/2007, 20h53
  5. Recuperer la position en pixel d'un <td>
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/12/2005, 10h06

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