PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Reconnaitre une couleur RVB
Reconnaitre une couleur RVB
Iniciado por VPH, 14,jun. 2020 00:22 - 4 respuestas
Miembro registrado
24 mensajes
Publicado el 14,junio 2020 - 00:22
Bonjour à tous

Je m'arrache les cheveux pour comprendre.

J'ai une image (jointe) qui est composée d'aplats de couleurs uniformes (c'est ce que me dit photoshop)
Je la met dans un champ image cliquable
Je capte avec dpixelcouleur la valeur rvb du pixel sous ma souris
J'obtient diverses valeurs (ils prévienne que ça peut dans la notice
https://doc.pcsoft.fr/fr-FR/?3029014&name=dPixelCouleur (quoiqu'ils ne parlent de différences qu'en fonction du réglage de l'affichage...)

Je reconvertis en valeurs RVB par conversion du n°de couleur avec rvbrouge(n), rvbvert(), rvbbleu() qui reconvertit en 3 valeurs de 0 à 255...
Mon pb : quand je clique dans une même zone de couleur, non seulement ;e dpixelcouleur est différent, mais la conversion RVB n'est pas unique !
J'ai pensé que c'était le fichier image, mais je ne vois rien, les pixels semblent bien uniformes (vérifié sur les stats image avec photoshop)
Est-ce un pb de format spécifique du fichier ? (j'ai essayé avec un gif et un jpg)

Procedure AfficherNomZone()

// Procédure qui permet d'afficher le nom de la zone sur laquelle on a cliqué

nPositionX est un entier = 0
nPositionY est un entier = 0
nCouleur est un entier = 0


// Récupérer la position du clic
nPositionX = SourisPosX()
nPositionY = SourisPosY()

SI nPositionX = -1 OU nPositionY = -1 ALORS RETOUR

// Récupérer la couleur correspondante à la position du clic
nCouleur = dPixelCouleur(IMG_invisible, nPositionX, nPositionY)
SAI_ncouleur = nCouleur

//je l'affiche dans un champ de saisie pour voir (c'est comme ça que je vois que c'est tout le temps différent à chaque clic)

SAI_RVB1 = RVBRouge(nCouleur)
SAI_RVB2 = RVBVert(nCouleur)
SAI_RVB3 = RVBBleu(nCouleur)

//Jai un fichier de données qui contient chaque nom re zone et la couleur RVB de sa zone sur le dessin

HExécuteRequête(REQ_chercheRVB,hRequêteDéfaut,SAI_RVB1,SAI_RVB2,SAI_RVB3,gnMonAffencours)
HLitPremier(REQ_chercheRVB)

//Hlitrecherchepremier(LOC1NomenclatureZonesclic,ncouleur,nCouleur)
SI PAS HEnDehors(REQ_chercheRVB) ALORS
ToastAffiche("trouvé " + REQ_chercheRVB.Libellé)
SINON
ToastAffiche("pas trouvé")
FIN


Jamais je ne tombe sur le bon RGB ! (je clique loin des bords de zone)

Un écran sale y est pour qq chose ???... je plaisante...

J'ai dû louper quelque chose...

Merci de vos pistes
VPH

--
VPH
Miembro registrado
151 mensajes
Publicado el 15,junio 2020 - 08:17
Avez-vous spécifié le DC avant d'utiliser dPixelCouleur (à savoir dDébutDessin).

--
Patrice Terrier
www.zapsolution.com
Publicado el 16,junio 2020 - 09:59
VPH avait soumis l'idée :
Bonjour à tous

Je m'arrache les cheveux pour comprendre.

J'ai une image (jointe) qui est composée d'aplats de couleurs uniformes
(c'est ce que me dit photoshop)
Je la met dans un champ image cliquable Je capte avec dpixelcouleur la valeur
rvb du pixel sous ma souris
J'obtient diverses valeurs (ils prévienne que ça peut dans la notice
https://doc.pcsoft.fr/fr-FR/?3029014&name=dPixelCouleur (quoiqu'ils ne
parlent de différences qu'en fonction du réglage de l'affichage...)

Je reconvertis en valeurs RVB par conversion du n°de couleur avec
rvbrouge(n), rvbvert(), rvbbleu() qui reconvertit en 3 valeurs de 0 à 255...
Mon pb : quand je clique dans une même zone de couleur, non seulement ;e
dpixelcouleur est différent, mais la conversion RVB n'est pas unique !
J'ai pensé que c'était le fichier image, mais je ne vois rien, les pixels
semblent bien uniformes (vérifié sur les stats image avec photoshop)
Est-ce un pb de format spécifique du fichier ? (j'ai essayé avec un gif et un
jpg)

Procedure AfficherNomZone()

// Procédure qui permet d'afficher le nom de la zone sur laquelle on a cliqué

nPositionX est un entier = 0
nPositionY est un entier = 0
nCouleur est un entier = 0


// Récupérer la position du clic
nPositionX = SourisPosX()
nPositionY = SourisPosY()

SI nPositionX = -1 OU nPositionY = -1 ALORS RETOUR

// Récupérer la couleur correspondante à la position du clic
nCouleur = dPixelCouleur(IMG_invisible, nPositionX, nPositionY)
SAI_ncouleur = nCouleur

//je l'affiche dans un champ de saisie pour voir (c'est comme ça que je vois
que c'est TOUT le temps différent à chaque clic)

SAI_RVB1 = RVBRouge(nCouleur)
SAI_RVB2 = RVBVert(nCouleur)
SAI_RVB3 = RVBBleu(nCouleur)

//Jai un fichier de données qui contient chaque nom re zone et la couleur RVB
de sa zone sur le dessin

HExécuteRequête(REQ_chercheRVB,hRequêteDéfaut,SAI_RVB1,SAI_RVB2,SAI_RVB3,gnMonAffencours)
HLitPremier(REQ_chercheRVB)

//Hlitrecherchepremier(LOC1NomenclatureZonesclic,ncouleur,nCouleur)
SI PAS HEnDehors(REQ_chercheRVB) ALORS
ToastAffiche("trouvé " + REQ_chercheRVB.Libellé)
SINON
ToastAffiche("pas trouvé")
FIN


Jamais je ne tombe sur le bon RGB ! (je clique loin des bords de zone)

Un écran sale y est pour qq chose ???... je plaisante...

J'ai dû louper quelque chose...

Merci de vos pistes
VPH


bonjour,

avez-vous essayé avec le code de l'exemple de la fonction dPixelCouleur
?

// -- Code de clic sur "IMG_ImageDessin"

// Déclaration des variables
CouleurPixel est un entier
CoordPixelHor est un entier
CoordPixelVert est un entier
CouleurPixelRouge est un entier
CouleurPixelVert est un entier
CouleurPixelBleu est un entier

// Récupération des coordonnées du pixel sélectionné
CoordPixelHor = SourisPosX()
CoordPixelVert = SourisPosY()

// Identification de la couleur du pixel sélectionné
CouleurPixel = dPixelCouleur(IMG_ImageDessin, CoordPixelHor,
CoordPixelVert)
CouleurPixelRouge = modulo(CouleurPixel, 256)
CouleurPixelVert = modulo(CouleurPixel/256, 256)
CouleurPixelBleu = modulo(CouleurPixel/256/256, 256)

// Affichage du résultat
Info("Les composantes couleur du pixel sont : " + RC + ...
TAB + "- Rouge : " + CouleurPixelRouge + RC + ...
TAB + "- Vert : " + CouleurPixelVert + RC + ...
TAB + "- Bleu : " + CouleurPixelBleu)

--
Cordialement JeAn-PhI
Miembro registrado
24 mensajes
Publicado el 16,junio 2020 - 13:43
Bonjour

Merci à tous de vos suggestions
Je regarde et reviens vers vous asap

cordialt

--
VPH
Miembro registrado
24 mensajes
Publicado el 16,junio 2020 - 14:21
Bon c'est pas ça
mais c'est pas étonnant car il est dit que
modulo(CouleurPixel, 256) c'est la même chose que RVBRouge(CouleurPixel)... et pareil pour vert et bleu
_________________________________________
J'ai refait une fenêtre avec 2 images :
la mienne et pour être sûre que ce n'est pas mon image celle de l'exemple FEN_zone de clicage (Imgcarteinvisible)

Appliqué le code ci-dessus de l'exemple dpixelcouleur : les résultats varient pour les couleurs des 2 images
POurtant la fenêtre d'exemple fonctionne parfaitement.

Son code est
Procedure AfficherPays()
// Procédure qui permet d'afficher le nom du pays sur lequel on a cliqué

nPositionX est un entier = 0
nPositionY est un entier = 0
nCouleur est un entier = 0
nIndice est un entier = 0

// Récupérer la position du clic
nPositionX = SourisPosX()
nPositionY = SourisPosY()

SI nPositionX = -1 OU nPositionY = -1 ALORS RETOUR

// Récupérer la couleur correspondante à la position du clic
nCouleur = dPixelCouleur(IMG_ImgCarteInvisible, nPositionX, nPositionY)

// Rechercher la couleur dans le tableau TabCouleur
nDimension est un entier = Dimension(gtabCouleur)

POUR nIndice = 1 À nDimension
SI gtabCouleur[nIndice] = nCouleur ALORS SORTIR
FIN

// La couleur n'a pas été trouvée
SI nIndice > nDimension ALORS RETOUR

// Afficher le nom du pays associé
Continent =(ChaîneConstruit("Le continent sélectionné est %1" ,gtabPays[nIndice]))


Ici il cherche nCouleur dans un tableau de couleurs prédéfini à l'initialisation de la fenêtre

// Procédure qui permet d'associer à chaque couleur le nom d'un pays
// ENTREE : TableauCouleur : Tableau contenant une couleur
// ENTREE : TableauPays : Tableau contenant le nom de chaque pays

TableauCouleur[1] = RVB(98, 165, 210); TableauPays[1] = "Amérique du Nord"
TableauCouleur[2] = RVB(0, 0, 255); TableauPays[2] = "Amérique du Sud"
TableauCouleur[3] = RVB(255, 158, 29); TableauPays[3] = "Europe"
TableauCouleur[4] = RVB(17, 220, 10); TableauPays[4] = "Afrique"
TableauCouleur[5] = RVB(255, 0, 0); TableauPays[5] = "Asie"
TableauCouleur[6] = RVB(156, 100, 56); TableauPays[6] = "Océanie"


et si on fait par exemple RVBRouge(TableauCouleur[4]) ça fait évidemment 17
Mais le résultat de RVB( revient à appliquer la formule :
<Résultat> : Entier
Couleur (24 bits) relative aux composantes fournies. Cette couleur est le résultat de la formule suivante :
Couleur = 65536 * Composante Bleu + 256 * Composante Verte + Composante Rouge.
donc c'est pareil le résultt RVB serait différent si ma mesure R, V, B est différente...

Je ne pige toujours pas...

En revanche j'ai trouvé cette note dans la notice de la fonction RVB

"Divers

Les couleurs demandées avec la fonction RVB peuvent être modifiées selon les capacités du mode écran en cours (VGA, 32 couleurs, etc.).
Important : Il est conseillé, pour indiquer les couleurs, d'utiliser les constantes de couleurs définies dans le WLangage (voir les couleurs prédéfinies du WLangage)."

Mais les conditions citées sont fixées une fois que je lance le programme sur mon ordi donc pendant l'exécution rien ne devrait bouger...
La deuxième phase est un peu mystérieuse et laisserait à penser que la détection n'est pas parfaite en dehors des couleurs usuelles du WL.

Cordialement

--
VPH