[Win32] lire pixel par pixel

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 21 sept. 2006 à 19:40
rayasahnoun Messages postés 8 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 27 mars 2007 - 27 mars 2007 à 09:00
Bonjour a tous,

Voila je cherche à créer un programme qui compare deux images, il faut donc pour cela que je lise les images pixel par pixel, hors n'ayant aucune notion des API traitent les images, je me demande par ou commencer.

Merci d'avance pour votre aide.

21 réponses

mogwai93 Messages postés 361 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 19 mars 2015
21 sept. 2006 à 20:18
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
21 sept. 2006 à 20:18
HBITMAP hBmp1, hBmp2;

//ici tu calcules la taille du tableau nécessaire pour récupérer les bits

et ensuite

GetBitmapBits(...)

ULARGE_INTEGERJokyQi=QI("Joky"
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
21 sept. 2006 à 20:20
Et ya Petzold qui parle de ça quand même
Je l'ai lu y'a pas longtemp C'est super intéressant

ULARGE_INTEGERJokyQi=QI("Joky"
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
22 sept. 2006 à 09:22
Tu veux comparer 2 images? Oui, mais 2 images "fichier" ou 2 images "dessinées"?
Dans le 1er cas, tu peux aller faire un tour sur ma source qui ouvre des fichiers BMP et qui fait qques traitements dessus

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0

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

Posez votre question
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 sept. 2006 à 13:38
Merci pour vos réponses, je vous tien au courant. Oui buno, 2 image fichier ;)
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 sept. 2006 à 15:39
Bon aparement je récupère bien les pixel :p car aucune fonctions ne renvoie d'erreur. Mais je voulai savoir, je les récupères dans un tableau d'int, c'est bon ? car sur la msdn c'est un pointeur de type void , donc de n'importe lequel, mais il y a t-il un type préfèrable pour récupérer et après comparer les pixels?
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 sept. 2006 à 16:44
Ben cela ne fonctionne pas, aparement je récupère bien les pixel des deux images, mais lors de la comparaison si j'en change un il me dit quand mm que les images sont identiques :s . Voici comment je fait en gros :

/* image 1. */           
             HBITMAP hBmp = LoadImage(GlobalHInstance,"signature.bmp",IMAGE_BITMAP,100,160,LR_LOADFROMFILE);
             HANDLE haFile = CreateFile("signature.bmp",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
             if(haFile == INVALID_HANDLE_VALUE)MessageBox(hwnd,"fuck off","rated",MB_OK);
             DWORD dwSize = GetFileSize(haFile,NULL);
             CloseHandle(haFile);
             iTabPixel = (char*) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSize);
             if(GetBitmapBits(hBmp,dwSize,iTabPixel) == 0)MessageBox(hwnd,"GetBitmapBits()","error",MB_OK);
            
            
             /* image 2. */
            
             HBITMAP hBmp2 = LoadImage(GlobalHInstance,"signature2.bmp",IMAGE_BITMAP,100,160,LR_LOADFROMFILE);
             HANDLE haFile2 = CreateFile("signature2.bmp",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
             if(haFile2 == INVALID_HANDLE_VALUE)MessageBox(hwnd,"fuck off","rated",MB_OK);
             DWORD dwSize2 = GetFileSize(haFile2,NULL);
             CloseHandle(haFile2);
             iTabPixel_2 = (char*) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSize2);
             if(GetBitmapBits(hBmp2,dwSize2,iTabPixel_2) == 0)MessageBox(hwnd,"GetBitmapBits()","error 2",MB_OK);
            
            
             //if(dwSize != dwSize2)MessageBox(hwnd,"Differents sizes","error",MB_OK);
             //else{
                  int x,y;                  for(x 0 , y 0; x < dwSize ,y < dwSize2 ; x++ , y++){
                          if((iTabPixel[x] != iTabPixel_2[y])){
                                          MessageBox(hwnd,"Not same","not",MB_OK);
                                          break;}
                  }
             MessageBox(hwnd,"same","OK",MB_OK);
             //}

            
             HeapFree(GetProcessHeap(),0,iTabPixel);
             HeapFree(GetProcessHeap(),0,iTabPixel_2);

Merci d'avance.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
23 sept. 2006 à 16:55
Attend, tu ne récupère pas les pixels là. Tu ne fais que récupéré le
fichier lui même et il n'y a pas que des pixels dans un bitmap. Je te
suggère vivement, pour récupéré les pixel, d'utiliser GetDIBits. Tu
pourra ainsi stocker les pixels de tes 2 fichiers dans 2 buffers
différents et comparer c'est buffer.

En passent, la taille requis pour un buffer de pixel peut-être suppérieur au tas du processus. Il faudra envisager l'utilisation de VirtualAlloc et VirtualFree pour ça.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
23 sept. 2006 à 16:57
Ah pardon, je reformule:

Tu ne fais que récupérer le fichier lui même et il n'y a pas que des pixels dans un fichier bitmap

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
23 sept. 2006 à 17:00
Ah ok je vois là. Tu récupère avec GetBitmapBits. Faut dire que le code est pas très lisible sur mon ordi :S Je ne connais pas cette fonction... désolé...

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
23 sept. 2006 à 17:05
Non mais il se plante carrément
La taille de ton tableau de pixel c'est pas la taille du fichier

Imagine : une image en noir et blanc ( donc 1 bit par pixel ) à une taille de cx * cy
Donc le tableau doit avoir la taille de cx * cy * 1
Enfin j'imagine

Lis bien petzold...

ULARGE_INTEGERJokyQi=QI("Joky"
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
23 sept. 2006 à 17:23
Et bien ma source Get et SetDIBits montre comment fonctionne le buffer et comment lire dedans en lecture aléatoire (ATTENTION LA LECTURE N'EST PAS SÉQUENCIELLE). Il pourrait aller y jetter un coup d'oeil.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 sept. 2006 à 17:52
Ok , donc pour récupérer la taille je vai lire l'entete du fichier et de la j'obtien largeur et hauteur et je fait * les bit par pixel (que j'obtien aussi via l'entete du fichier bitmap), j'alloue mes deux tableaux de char, mais comment alors mettre dans met tableau de char juste les pixels? toujour avec GetBitmapBits() ?
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
24 sept. 2006 à 11:51
En faite je vai juste recup le DC et puis faire avec GetPixel() après. Merci pour votre aide.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
24 sept. 2006 à 15:46
C'est justement ce que j'essayais d'éviter en te conseillant GetDIBits. GetPixel fera l'affaire oui mais sera horriblement lent. Si ton image est grande et que la vitesse est un facteur important, oublie cette fonction.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
24 sept. 2006 à 16:14
Ha daccord, j'ai compris ton code, mais l'ennui c'est que tu force en 24, mais si je veut par exemple comparer 2 images en 16 et que je force en 24 comme tu la fait, cela ne va pas fausser ma vérification ? et aussi il y a plusieur calcules que je ne comprend pas non plus dans ton code, enfin je sais a quoi il serve mais pas comment tu les calcules :

exemple :

ByteWidth = 4*((3*bi.bmiHeader.biWidth+3)/4);    :s comment tu calcule ça ? en allouant un tableau 2 dimension de BYTE  de largeur * auteur cela devrai suffir comment buffer non ?

Deplus tu rétressi la taille , enfin ça je suis pas obligé de le faire, mais voila un avantage de GetPixel, pas besoin d'allouer de mémoire.

Enfin je voi cela comme ça.
0
rayasahnoun Messages postés 8 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 27 mars 2007
23 mars 2007 à 12:33
Bonjour,
Est ce que t'a codé une fonction qui permet d'accéder aux données du pixel?
quel classe t'a utilisé?(une pour l'entete du fichier BMP pour récupérer la longueur et largeur et autre pour pixel(RVB)?
Merci!
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 mars 2007 à 14:17
Etant donné que c'est du C, aucune classe n'à été utilisée :D

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
rayasahnoun Messages postés 8 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 27 mars 2007
23 mars 2007 à 16:54
Salut
j'ai besoin d'une fonction pour vérifier si un pixel a bien varié lors de deux acquisitions alors ca consiste a faire une comparaison entre deux pixels de deux images.
mon probléme comment charger les données de ces deux images (nombre de pixel, matrice de pixel..)
merci d'avance!!!
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
26 mars 2007 à 19:40
Donne moi un mail, j'ai justement fait un programme qui compare et renseigne les pixel différent entre deux image, pratique pour les fichier stéganografié :D mais juste compatible bmp, j'arive pas a rendre compatible avec jpg et autres.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
Rejoignez-nous