Afficher un tableau de pixels

elinep Messages postés 56 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 3 décembre 2009 - 12 avril 2004 à 14:02
gabuzomeuh Messages postés 53 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 28 mars 2007 - 11 août 2007 à 01:02
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

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
12 avril 2004 à 14:30
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]=--
0
elinep Messages postés 56 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 3 décembre 2009
12 avril 2004 à 15:03
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?
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
12 avril 2004 à 17:30
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]=--
0
elinep Messages postés 56 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 3 décembre 2009
12 avril 2004 à 18:28
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?
0

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

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
12 avril 2004 à 23:06
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)
0
elinep Messages postés 56 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 3 décembre 2009
15 avril 2004 à 11:33
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.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
15 avril 2004 à 16:15
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.
0
elinep Messages postés 56 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 3 décembre 2009
15 avril 2004 à 16:55
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)?
0
elinep Messages postés 56 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 3 décembre 2009
15 avril 2004 à 21:40
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...
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
16 avril 2004 à 00:00
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)
0
elinep Messages postés 56 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 3 décembre 2009
16 avril 2004 à 10:53
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?
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
16 avril 2004 à 13:07
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.
0
elinep Messages postés 56 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 3 décembre 2009
16 avril 2004 à 16:02
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.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
17 avril 2004 à 13:20
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);
0
propagandacom Messages postés 2 Date d'inscription samedi 3 mars 2007 Statut Membre Dernière intervention 4 mars 2007
4 mars 2007 à 14:37
pouvez vous m'aidez svp pr afficher une image de type pgm sur l'interface de mon application sachant que j'utilise VC++
0
gabuzomeuh Messages postés 53 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 28 mars 2007
11 août 2007 à 01:02
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;
}
0
Rejoignez-nous