Valeurs anormales retournées par getpixel

Résolu
i4551 Messages postés 5 Date d'inscription vendredi 12 août 2005 Statut Membre Dernière intervention 15 septembre 2005 - 13 sept. 2005 à 21:09
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 - 15 sept. 2005 à 23:12
bonjour,



j'utilise l'api getpixel dans une macro sous VBA pour excel afin
de lire les valeurs rgb d'une image et de les deposer ensuite dans une
feuille excel afin d'y realiser des calculs trop complexes pour le
faire directement sous vb6 ( passage par tableau croisé dynamique
et graphiques ).

je n'affiche pas l'image dans un picture.box mais je la met dans un objet bitmap .

il s'agit en fait d'un travail en boucle sur des millers de scan de feuilles d'arbres pour un travail scientifique .

mon pb : les valeurs rgb renvoyées par getpixel ne sont pas exactement
celles que je peut lire au même endroit en utilisant la souris et
les infos de pixel dans un logiciel comme xnview ou irfan view.

les valeurs renvoyées par get pixel sont proches des valeurs lues
sur xnview mais regroupées sur certaines valeurs seulement .

les valeurs rgb retournées sont rpartie de façon discrete sur la gamme
0-255 et non de façon conitnue avec un pas fix de 8 .

il y a dejà eu une discussion sur quelques chose qui ressemble un peu à celà

http://vbfrance.com/forum.v2.aspx?id=400214

est ce que getpixel fait la même chose cad qu'il tient compte de la
configuration graphique du pc pour renvoyer des valeurs rgb apporchante
et non des valeurs "exactes" ?



hlb

7 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
15 sept. 2005 à 23:12
Mettre une réponse accepté cela veut dire "cliquer sur le bouton "Réponse acceptée !" qui se trouve sous le ou les réponses ayant solutionner ton problème. Ainsi, cela apparait lorsque l'on liste les questions du forum et cela permet aux autrs (qui aurait le même souci que toi plus tard) de savoir qu'une réponse satisfaisante se cache derrière ta question ... Qd tu auras eu besoin de recherché un truc ou deux sur le forum tu comprendras l'intéret de la chose ...
Pour connaitre le bitplan de la config windows, je suppose qu'une api doit trainer mais je la connais pas et j'ai pas apiguide sur cette bécane ...
3
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
14 sept. 2005 à 09:18
Get pixel te retourne la valeur de al couleur qui est réellement affiché (même si tu n'affiches pas l'image, il travaille comme si elle l'était).
Une couleur RGB est une combinaison de 255*255*255 soit 16 million de couleur.
Si dans ta config d'affichage Windows, tu n'es pas en 16M de couleur, l'API GetPixel() te donne la couleur la plus proche de la couleur réelle en fonction de ta config de drésolution écran.

Christophe
1
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 sept. 2005 à 03:08
Salut
Pour lire les couleurs, tu fais comment ? (un peu dur de te répondre sans élément)
Les couleurs de base sont toujours définies sur un octet. Pourquoi parles-tu de pas fixe de 8 ?
Si ça peut aider :

Dim Gr As Long, PicHdc As Long, lX As Long, lY As Long
Gr = GetPixel(PicHdc, lX, lY)
RedValue = Red(Gr)
BluePixel = Blue(Gr)
GreenPixel = Green(Gr)

Avec :
Function Red(ByVal Color As Long) As Integer
Red = Int(Color - Int((Color - Int(Color / 65536) * 65536) / 256) * 256 - Int(Color / 65536) * 65536)
End Function
Function Green(ByVal Color As Long) As Integer
Green = Int((Color - Int(Color / 65536) * 65536) / 256)
End Function
Function Blue(ByVal Color As Long) As Integer
Blue = Int(Color / 65536)
End Function

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 sept. 2005 à 03:10
Eventuellement, si tu lis l'anglais, parcours cette source dont l'auteur semble maitriser la gestion des couleurs.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
i4551 Messages postés 5 Date d'inscription vendredi 12 août 2005 Statut Membre Dernière intervention 15 septembre 2005
14 sept. 2005 à 23:08
merci à tous ,
je pense que c'est Cristophe qui avais la solution au pb , l'un des postes ou je teste l'application étais en 16 bits d'affichage couleur et non en 32 .( fait pour gagner du tem
ps ) , je suis repassé en 32 bit no pb

pour jack ci dessous le code (sans lesdéclarations)


Set img = LoadPicture(faji)


imgdc = CreateCompatibleDC(GetDC(0)) 'crée un Devide Context (DC)


SelectObject imgdc, img 'charge l'image ds le DC






Function dif(locdc, xc, yc)
couleur = GetPixel(locdc, xc, yc)
tabcoul(1) = Int(couleur / 65536)
tabcoul(2) = Int((couleur - (65536 * tabcoul(1))) / 256)
tabcoul(3) = couleur - ((tabcoul(1) * 65536) + (tabcoul(2) * 256))
dif = Maxp(tabcoul) - Minp(tabcoul)
End Function

Function coulrgb(locdc, xc, yc)


couleur = GetPixel(locdc, xc, yc)


tabcoul(1) = Int(couleur / 65536)


tabcoul(2) = Int((couleur - (65536 * tabcoul(1))) / 256)


tabcoul(3) = couleur - ((tabcoul(1) * 65536) + (tabcoul(2) * 256))


End Function

Function Maxp(values()) As _
Variant
Dim i As Integer
Dim max_value As Variant


max_value = values(LBound(values))
For i = LBound(values) + 1 To UBound(values)
If max_value < values(i) Then max_value = values(i)
Next i


Maxp = max_value
End Function

' Return the smallest parameter value.
Function Minp(values()) As _
Variant
Dim i As Integer
Dim min_value As Variant


min_value = values(LBound(values))
For i = LBound(values) + 1 To UBound(values)
If min_value > values(i) Then min_value = values(i)
Next i


Minp = min_value
End Function
que du classique donc , les valeurs rgb sont chargées dans un tableau, maxp et min sortent les valeurs extremes , ladifférence sert a distinguer les points de vrai couleurs du fond plus ou moin blanc (dif <20 pixels) et donc a reperer la feuille d'arbre photograpiée ou scannée sur le fond ensuite c'est le boulôt d'excel de faire les calculs .
tout celà ressemble un peu au magic wand de photoshop

avec çà je traite une image en moins d'une 1/2 seconde ( 1200*1600 pixels) c'est pas mal

and now , the show must go on
kenavo
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
15 sept. 2005 à 09:15
Pense à mettre une réponse accepté quelque part ....

Christophe
0
i4551 Messages postés 5 Date d'inscription vendredi 12 août 2005 Statut Membre Dernière intervention 15 septembre 2005
15 sept. 2005 à 22:45
christophe ?

comprends pas ce que tu veux dire c'est quoi une reponse acceptée et poutquoi faire celà ? . c'est liée aux règles du forum ??
autre chose ;
quelqu'un sait t'i lsi on peut et comment en vb connâitre la config de couleur de windows , pour au minimu envoyer un message d'alerte et eventuellement la modifier via le programme .
hlb
0
Rejoignez-nous