Accueil > Forum > > > > Récupération des pixels d'un DC
Récupération des pixels d'un DC
vendredi 16 décembre 2005 à 14:41:39 |
Récupération des pixels d'un DC

hilairenicolas
|
Bonjour, Je dispose d'un DC où je voudrais récuperer le tableau de byte correspondant aux pixels qui le composent. Je me suis fortement inspiré de la source de YMCA, mais cela ne marche pas, je récupère que du noir. Où me suis-je trompé ? SIZE GetBmpSize(HBITMAP hBmp) { BITMAP bmpInfo; GetObject(hBmp, sizeof(bmpInfo), &bmpInfo); SIZE size; size.cx = bmpInfo.bmWidth; size.cy = bmpInfo.bmHeight; return size; }
LPVOID GetBmpData(HDC hdc, HBITMAP hBmp) { SIZE sizeBmp = GetBmpSize(hBmp); if(sizeBmp.cy < 0) return NULL; DWORD dwSize = 4*sizeBmp.cx*sizeBmp.cy; LPVOID lpMem = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE); if(lpMem == NULL) return NULL; BITMAPINFO bi; ZeroMemory(&bi, sizeof(BITMAPINFO)); bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biWidth = sizeBmp.cx; bi.bmiHeader.biHeight = sizeBmp.cy; bi.bmiHeader.biCompression = BI_RGB; int nResult = GetDIBits(hdc, hBmp, 0, sizeBmp.cy, lpMem, &bi, DIB_RGB_COLORS); if(nResult != 0) return lpMem; VirtualFree(lpMem, 0, MEM_RELEASE); return NULL; }
// APPEL int width = GetDeviceCaps(hdc, HORZRES); int height = GetDeviceCaps(hdc, VERTRES); HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height); HBITMAP oldBmp = (HBITMAP)SelectObject(hdc, hbmp); LPVOID lpDataBmp = GetBmpData(hdc, hbmp); if(lpDataBmp != NULL) { SIZE sizeBmp = GetBmpSize(hbmp); for (int y = sizeBmp.cy; y >=0 ; y--) // je commence par la dernière ligne { for(int x = 0; x < sizeBmp.cx; x++) { LPDWORD lpByte = (LPDWORD)lpDataBmp + sizeBmp.cx * y + x; DWORD p = *lpByte; // je regarde la valeur de la couleur, qui vaut toujours 0 } } } VirtualFree(lpDataBmp, 0, MEM_RELEASE); SelectObject(hdc, oldBmp); DeleteObject(hbmp);
Merci de votre aide
|
|
vendredi 16 décembre 2005 à 22:12:12 |
Re : Récupération des pixels d'un DC

SnOOpss
|
C normal
HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height); HBITMAP oldBmp = (HBITMAP)SelectObject(hdc, hbmp);
La tu creéé un HBITMAP vide.
LPVOID lpDataBmp = GetBmpData(hdc, hbmp);
La tu en tire un tableau mais vide.
C la ou tu remplis ton tableau (a la place de getpixel)
De memoire tu voulais pas te passer des BITMAP dans tes precedent post (ou je confond) ??
Sinon tu as un autres exemple (avec les bitmap et des tableaux)
http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1779/
Sur leur site a la partie c++ / graphicmultimedia/ bitmap et palette tu
en trouvera des dizaines (JAMAIS ils utilisent setpixel et getpixel).
|
|
samedi 17 décembre 2005 à 19:57:58 |
Re : Récupération des pixels d'un DC

hilairenicolas
|
En gros, pour remplir mon tableau, faudrait que je fasse un bitblt ? ou autre chose ?
|
|
dimanche 18 décembre 2005 à 11:33:33 |
Re : Récupération des pixels d'un DC

SnOOpss
|
DSl je t 'avais confondu avec quelqu'un, du coup je voit plus trop le but de ton code !
http://www.cppfrance.com/forum.v2.aspx?ID=618463
Pour remplir ton tableau
Soit tu cherche a remplacer la commande SetPixel pour remplir toi meme
le tableau juste avec des operation de pointeur (tu le remplis de pixel
en RGB)
>>LPDWORD lpSrc = (LPDWORD)lpDataBmp+sizeSrc.cx*y+x
>> *lpSrc =....
Soit tu recupere un DC deja existant et donc deja plein, il fallait donc le recuperer et non le creer.
Et une foit le tableau rempli, la tu pourra le recopier dans un DC pour pouvoir le "bitbliter"
|
|
lundi 19 décembre 2005 à 14:28:51 |
Re : Récupération des pixels d'un DC

hilairenicolas
|
alors, ce que je fais moi c'est ca :
int width = GetDeviceCaps(hdc, HORZRES); int height = GetDeviceCaps(hdc, VERTRES); HDC memDC = CreateCompatibleDC(hdc); HBITMAP memBM = CreateCompatibleBitmap(hdc, width, height); HBITMAP oldBmp = (HBITMAP) SelectObject ( memDC, memBM ); LPVOID lpDataBmp = GetBmpData(memDC, memBM);
Et si j'ai bien compris, SelectObjet me remplis le memBM, (et en couleur, dixit msdn), donc pourquoi j'ai que du noir ? pourquoi que des 0 à l'adresse pointée par lpDataBmp ? Ou est l'erreur ? (je précise que mon DC est DT_RASPRINTER)
|
|
lundi 19 décembre 2005 à 18:46:02 |
Re : Récupération des pixels d'un DC

SnOOpss
|
HDC memDC = CreateCompatibleDC(hdc);
Tu creé un HDC vide.
HBITMAP memBM = CreateCompatibleBitmap(hdc, width, height);
tu créé un HBITMAP qui ne contient rien
HBITMAP oldBmp = (HBITMAP) SelectObject ( memDC, memBM );
tu selectionnes le bitmap vide dans le DC vide
LPVOID lpDataBmp = GetBmpData(memDC, memBM);
Tu recupere donc un tableau vide. Ou veut tu voir de la couleur ??
Affiche une image dans memDC si tu veut avoir quelque chose.
En supposant ke hdc possede quelque chose essaye
LPVOID lpDataBmp = GetBmpData(hdc, memBM);
|
|
Cette discussion est classée dans : bi, hdc, size, hbmp, sizebmp
Répondre à ce message
Sujets en rapport avec ce message
Pixel vide [ par sabran ]
Salut, Je veux lire la valeur RGB d'un pixel avec GetDIBits. J'ai pris un code que j'ai vu plusieurs fois sur le forum. Tout marche sauf quand je veux
HDC d'une BITMAP ? [ par unrealgun ]
Bonjour, depuis quelques jours je cherche comment obtenir le HDC d'une bitmap. je sais pas si c'est possible. J'ai essayé GetDC(hbmp) puis GetPixel po
disparition de mon bitmap. [ par oRTEEZ ]
Voila j'ai une fenetre dans lequel je load mon un bitmap al'aide de la fonction suivante. Mon probleme es t que si je passe sur un autre prog mon imag
Dessiner un Rectangle [ par SnOOpss ]
bonjour tout le monde, vla le probleme :HBITMAP hbmp = (HBITMAP)LoadImage(0,"c:\\logo.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);HDC hdc;hdc = GetWindowDC
Probleme avec une fonction de rotation [ par SnOOpss ]
voila ma fonction HBITMAP rotate90(HBITMAP hbmp) { BITMAP bm; GetObject((HBITMAP)hbmp, sizeof(bm), &bm); BITMAPINFO bi,biNew; biNew.bmiHeader.biSiz
Probléme de compilation [ par makina0711 ]
Bonjour a tous j'ai cette source pour ouvrire mon bmp mais a cette ligne il y a une ereure: DrawState(hdc,NULL,NULL,(long)hBmp,NULL,10,10,0,0,DST_BI
Winapi avec langage C : Comment afficher un texte dans une fenêtre en rafraichissant le texte par un autre. [ par sanderriere ]
Bonjour, Comment faire en sorte d'afficher un texte dans une fenêtre et de pouvoir ensuite faire en sorte de le modifier lorsqu'on le souhaite par un
Convertir un bmp monochrome en couleur? [ par freehair ]
Je veux afficher une image noir et blanc et faire une analyse en couleur dessus.Ca marche quand je pars d'une image en couleur(j'ai modifié l'image ma
redimensionnement bitmap et mémoire occupée [ par mogwai93 ]
BonjourJ'ai une image bmp que je redimensionne avec StretchBlt pour qu'elle s'affiche dans la zone de mon choixor au niveau du gestionnaire des taches
Parser un DC/DIB [ par Manson ]
Salut a tous,voila je voudrais recuperer une capture d'ecran (ca j'ai reussi).Ensuite je voudrais l'afficher sur le fond de ma fenetre, mais pas d'un
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|