Afficher un tableau de pixels

Signaler
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009
-
gabuzomeuh
Messages postés
53
Date d'inscription
jeudi 31 juillet 2003
Statut
Membre
Dernière intervention
28 mars 2007
-
Donc comment peut on en win32 afficher une image que l'on a sous la forme d'une matrice de pixels?
J'ai essaye en faisant CreateBitmap() puis en modifiant chaque pixel suivant ma matrice et d'afficher le tout mais je n'y suis pas arrive.

16 réponses

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Utilise l'API SetPixel qui te permet d'afficher un pixel selon sa couleur et sur le contexte (DC) que tu choisies...
Tu peux ainsi redessinner n'importe quel image sur n'importe quem contexte !

--=[DeAtH_-_CrAsH]=--
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009

Merci pour ta reponse!
Alors je progresse: j'arrive a mettre de la couleur :)
Par contre je pense que je vais encore avoir besoin de tes lumieres:
Si je fais juste SetPixel() evidemment ce que je dessine va disparaitre si par exemple je reduis ma fenetre alors comment on fait pour le reafficher? Je suppose qu'on ne va pas s'amuser a redessiner chaque pixel en fonction de ma matrice, ca doit etre gourmand en ressources ca non?
On ne devrait pas plutot creer un hbitmap en fonction de la matrice? Si oui comment on fait?
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Essaye de mettre ton image dans un control Picture ...
SI je me trompe pas, elle ne sera pas modifié en cas de resize ou minimisation de la fenetre dans la barre des taches ... Mais j'en suis pas sure ....
Tu me poses une colle la =)

--=[DeAtH_-_CrAsH]=--
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009

Arf lol!
Sinon je pensais que c'etait possible avec CreateCompatibleBitmap() mais je sais pas comment on peut modifier la valeur des pixels du bitamap cree....une idee?
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
avec CreateDIBSection tu auras un HBITMAT que tu pourras afficher ou tu veux avec en plus un accès aux pixels
(jète un oeil à ma source paint pour l'accès aux pixels d'un bitmap créé comme ça.

le bitmap est affiché en traitant WM_PAINT (qui redessine la fenêtre qd y'a besoin)
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009

Merci de ta reponse ymca2003 je crois que tu m'as montré le bon chemin mais la route et longue et je rencontre deja un obstacle :)
Donc j'ai reussi a cree un Hbitmap avec CreateDIBSection() j'ai meme vu comment on pouvait dessiner des trucs dedans (genre rectangle etc...) par contre je n'arrive pas a acceder aux pixels... j'ai regardé ta source mais c'est un peu chaud pour mon petit niveau lol.
Donc ci quelqu'un pouvait me dire comment on peut modifier les pixels d'un bitmap cree a l'aide de cette fonction ca serait gentil.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
bas en fait cela dépend du nombre de bits par pixels que tu as (si tu en as 24 ou 32, c'est le plus facile)

dans ma source, les 3 fct que tu doit regarder st dns le fichier BmpDoc.cpp:

GetColorPixel, SetColorPixel et GetPixelData.

ce qu'il fat savoir c'est que chaque ligne de pixel en mémoire est obligatoirement multiple de 4 octets (avec des 0 de bourrage si besoin)

par exemple si ton bitmap fait 63 pixels de large avec 24 bits/pixel, chaque ligne fera :
24*63 = 1512 bits soit 189 octets, align& sur 192 octets.
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009

Merci pour tes precisions.
Justement dans ta source que represente m_lpBits ?
Ensuite quelle type de données doit on ecrire un COLOREF (cas 24bits)?
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009

Ok je crois que je commence a comprendre.
Si je ne me trompe pas ce qui va me permettre d'acceder aux bits c'est le 4e parametre de la fonction CreateDIBSection () a savoir le: "PVOID *ppvBits" mais j'ai pas trop idee de ce que c'est et de comment on l'utilise...
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
justement dans les fct de ma source que je t'ai signalé elle accède au donné d'un pixel de ce ppvBits(trabsformé en LPBYTE)
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009

Bon j'ai fait comme dans ta source.Donc j'ai un LPBYTE m_lpBits et j'ai CreateDIBSection ( , , , (void**) &m_lpBits, , )
Apres j'ai essaye d edirectemetn ecrire une valeur a m_lpBits mais il me dit que je ne peux pas ecrire a l'adresse 0. J'ai donc l'impression que m_lpBits n'a pas ete initialise c'est normal?
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Quelle est la valeur retournée par CreateDIBSection ?
si c'est NULL au lieu d'un HBITMAP valide c'est qu'il y a un pb dans les paramètres passés (GetLastError de donnera peut-être plus d'info).

vérifie que tous les champs de BITMAPINFO (et BITMAPINFOHEADER) sont valides.
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009

Bon alors je m'en suis sorti avec un CreateDIBitmap (), ca y est ca marche.Maintenant il me reste plus qu'a comprendre comment ca marche :blush)
En tout cas merci pour ta patience ymca2003 et de ton aide.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
voici un exemple de DIBSction :
HDC hdc = GetDC(NULL);
BITMAPINFO bi = {0};
memset(&bi, 0, sizeof(BITMAPINFO));
bi.bmiHeader.biSize= sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth=128;
bi.bmiHeader.biHeight=64;
bi.bmiHeader.biPlanes=1;
bi.bmiHeader.biBitCount=24;
bi.bmiHeader.biCompression=BI_RGB;
hBitmap = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, (void**)&lpBits, NULL, 0);
ReleaseDC(NULL, hdc);
memset(m_lpBits, 0xFF, 128*64*3);

pour affecter la couleur du pixel (x,y) (coordonnées standards ie 0,0 en haut à gauche, mais le bimap est inversé en y):
LPBTYTE lpPixel = lpBits+128*3*(63-y)+3*x:
lpPixel[0] = B;
lpPixel[1] = G;
lpPixel[2] = R;

128*3 doit être multiple de 4, sinon mettre un padding.

pour afficher ce bitmap dans un DC :
HDC hBmpDC = CreateCompatibleDC(hdc);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(x, y, 128, 64, hBmpDC, 0, 0, SRCCOPY);
SelectObject(hBmpDC, hOldBmp);
DeleteDC(hBmpDC);
Messages postés
2
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
4 mars 2007

pouvez vous m'aidez svp pr afficher une image de type pgm sur l'interface de mon application sachant que j'utilise VC++
Messages postés
53
Date d'inscription
jeudi 31 juillet 2003
Statut
Membre
Dernière intervention
28 mars 2007

Moi j'ai un tableau de bits a afficher et je n'y arrive pas.


case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc;
int wBits[] = { 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF };

hdc = BeginPaint(hWnd,&ps);
// ici on déclare le bitmap
HBITMAP BitMap = CreateBitmap(8, 8, 1, 24, wBits);
// apres on fait quoi ici ?

EndPaint(hWnd,&ps);
return 0;
}