Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Récupération des pixels d'un DC [ Archives / API ] (hilairenicolas)

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é 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 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 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 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


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.