Valeurs anormales retournées par getpixel [Résolu]

i4551 5 Messages postés vendredi 12 août 2005Date d'inscription 15 septembre 2005 Dernière intervention - 13 sept. 2005 à 21:09 - Dernière réponse : crenaud76 4172 Messages postés mercredi 30 juillet 2003Date d'inscription 9 juin 2006 Dernière intervention
- 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
Afficher la suite 

7 réponses

Meilleure réponse
crenaud76 4172 Messages postés mercredi 30 juillet 2003Date d'inscription 9 juin 2006 Dernière intervention - 14 sept. 2005 à 09:18
3
Merci
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

Merci crenaud76 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Meilleure réponse
crenaud76 4172 Messages postés mercredi 30 juillet 2003Date d'inscription 9 juin 2006 Dernière intervention - 15 sept. 2005 à 23:12
3
Merci
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 ...

Merci crenaud76 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 14 sept. 2005 à 03:08
0
Merci
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)
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 14 sept. 2005 à 03:10
0
Merci
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)
i4551 5 Messages postés vendredi 12 août 2005Date d'inscription 15 septembre 2005 Dernière intervention - 14 sept. 2005 à 23:08
0
Merci
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
crenaud76 4172 Messages postés mercredi 30 juillet 2003Date d'inscription 9 juin 2006 Dernière intervention - 15 sept. 2005 à 09:15
0
Merci
Pense à mettre une réponse accepté quelque part ....

Christophe
i4551 5 Messages postés vendredi 12 août 2005Date d'inscription 15 septembre 2005 Dernière intervention - 15 sept. 2005 à 22:45
0
Merci
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.