[Win32] lire pixel par pixel

Signaler
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
-
Messages postés
8
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
27 mars 2007
-
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

Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
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"
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
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"
Messages postés
14934
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 janvier 2021
93
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
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Merci pour vos réponses, je vous tien au courant. Oui buno, 2 image fichier ;)
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
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?
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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<!--
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
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"
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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<!--
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
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() ?
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
En faite je vai juste recup le DC et puis faire avec GetPixel() après. Merci pour votre aide.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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<!--
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
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.
Messages postés
8
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
27 mars 2007

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!
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Etant donné que c'est du C, aucune classe n'à été utilisée :D

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
Messages postés
8
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
27 mars 2007

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!!!
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
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]