IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[GetDIBits] Quelle taille pour lpvBits ?


Sujet :

Windows

  1. #1
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut [GetDIBits] Quelle taille pour lpvBits ?
    Bonsoir tout le monde,
    Je travaille actuellement sur une application pour manipuler un peu ma webcam, et même de façon un peu plus générale, tout type de système d'acquisition vidéo. Bref, je suis actuellement en train de tenter de créer une fonction permettant de capturer une image depuis ce périphérique (on dira la webcam pour la moment). Dans un soucis de rapidité d'éxécution, je me suis dit qu'il valait mieux avant récupérer l'image du périphérique comme une image et ensuite que je m'amuse à la traiter. Pour cela je commence comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    // Pour que le processus soit plus rapide, on enregistre l'image de 
        // la Webcam dans un bitmap
        BITMAPINFO* bmpInfo = new BITMAPINFO;
        bmpInfo->bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);    // Obligatoire
        bmpInfo->bmiHeader.biWidth    = wcWidth;                    // Largeur de l'image
        bmpInfo->bmiHeader.biHeight   = wcHeight;                    // Hauteur de l'image
        bmpInfo->bmiHeader.biPlanes   = 1;                            // Obligatoire
        bmpInfo->bmiHeader.biBitCount = 32;                            // Image 32 bits
        bmpInfo->bmiHeader.biCompression = BI_RGB;                    // Pas de compression
        bmpInfo->bmiHeader.biSizeImage   = 0;            // Puisque pas de compression, on le laisse gérer
        bmpInfo->bmiHeader.biXPelsPerMeter = 0;
        bmpInfo->bmiHeader.biYPelsPerMeter = 0;
        bmpInfo->bmiHeader.biClrUsed      = 0;                        // Toutes les couleurs
        bmpInfo->bmiHeader.biClrImportant = 0;                        // Toutes les couleurs
    
    void* valeursBitsBMP;                    
        HBITMAP hBMP(CreateDIBSection(
                            hWndWebcam,
                            bmpInfo,
                            DIB_RGB_COLORS,
                            &valeursBitsBMP,        // Tableau contenant la valeur des bits de l'image
                            NULL,                    // Obligatoire
                            0                        // Ignoré
                            ));
        if (hBMP==NULL)
        {
            delete bmpInfo;
            delete valeursBitsBMP;
            return false;
        }

    ensuite c'est là que j'ai un soucis. Afin de récupérer l'image, si j'ai tout bien pigé (et corrigez moi tout de suite si je me trompe ...) je dois là utiliser la fonction GetDIBits. Seulement en jetant un oeil sur MSDN je vois qu'elle nécessite un pointeur sur LPBYTE. Ok ... mais à quoi ça correspond ? D'après ce que j'ai compris de MSDN, ça récupère les données de l'image BMP ... certes, mais qu'elle taille faut-il prévoir pour ce pointeur ? Quelle quantité de mémoire dois-je réserver et à quoi correspond-elle ?


    Par avance je remercie quiconque pourra m'aider


    @ plus bonne soirée
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Vu que tu as déjà un pointeur sur les bits retourné par CreateDIBSection(), ET que ton image n'a pas de palette de couleurs, je ne pense pas que tu aies besoin de GetDIBits()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    En fait, vu que j'avance un peu dans le noir si je vous dis ce que je veux faire peut-être que quelqu'un pourra m'apporter la solution ou au moins une piste de solution (si ça se trouve là je vais droit dans le mur comme je suis en train de faire).
    Ce que je souhaite faire, c'est qu'à un instant donné je puisse récupéré l'image de la webcam (comme si on faisait une photo) pour ensuite pouvoir faire divers traitements dessus. J'ai la solution de parcourir le DC complet de la webcam, pixel par pixel et de les copier dans un tableau => processus trop long, immobilisant la webcam. Par conséquent je cherchais un autre moyen ...
    Avec mes recherches je suis tombé là dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    {
        int i, j;        // Bcl
        int R, G, B;    // Recupère des infos
    
        HDC hDC_tmp;    // Pour récupérer les pixels
        LPBYTE lpBits = new BYTE[4*320*240];    // Idem
        HWND hwnd=hWnd_WC;                        // Fenetre de la capture
        HDC memdc, hdc;                            // DC
        void *pBits;                            // Tbl de pixel
        HBITMAP hbmp;                            // Image
        BITMAPINFO bmpinfo;                        // info sur l'image
        HGDIOBJ hret;                            // Pour récupérer l'image
    
        hdc = hDC_WC;                            // Va avec le hWnd
    
        // C'est marqué
        if(!(memdc = CreateCompatibleDC(hdc)))
            return;
    
        // Donne les infos sur le bitmap
        bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bmpinfo.bmiHeader.biWidth = 320;
        bmpinfo.bmiHeader.biHeight = 240;
        bmpinfo.bmiHeader.biPlanes = 1;
        bmpinfo.bmiHeader.biBitCount = 32;
        bmpinfo.bmiHeader.biCompression = BI_RGB;
        bmpinfo.bmiHeader.biSizeImage = 0;
        bmpinfo.bmiHeader.biXPelsPerMeter = 0;
        bmpinfo.bmiHeader.biYPelsPerMeter = 0;
        bmpinfo.bmiHeader.biClrUsed = 0;
        bmpinfo.bmiHeader.biClrImportant = 0;
    
        // Création du bitmap
        hbmp = CreateDIBSection(hdc, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);
        
        // En cas d'erreur
        if(!hbmp)
        {
            // Fait le ménage
            DeleteObject(hbmp);
            DeleteDC(memdc);
            free(pBits);
            return;
        }
    
        // Sélectionne le mendc avec l'image
        hret = SelectObject(memdc, hbmp);
        if(!hret || (hret == HGDI_ERROR))
        {
            // Fait le ménage
            DeleteObject(hbmp);
            DeleteDC(memdc);
            free(pBits);
            return;
        }
    
        // Colle l'image
        if(!BitBlt(memdc, 0, 0, 320, 240, hdc, 0, 0, SRCCOPY))
        {
            // Fait le ménage
            DeleteObject(hbmp);
            DeleteDC(memdc);
            free(pBits);
            return;
        }
    
        // Récupère le DC
        hDC_tmp=GetDC(NULL);
    
        // Récupère les pixels
        GetDIBits(hDC_tmp, hbmp, 0, 240, lpBits, &bmpinfo, DIB_RGB_COLORS);
    
        // Fait le ménage
        ReleaseDC(NULL, hDC_tmp);
    
        // Parcoure les pixels et les stocke dans un tbl
        for(i=0; i<240; i++)
            for(j=0; j<320; j++)
            {
                // Récupère chaque coef du RGB
                TblImage[ID_Bmp].points[i][j].R            = R = lpBits[4*320*(239-i)+4*j+2];
                TblImage[ID_Bmp].points[i][j].G            = G = lpBits[4*320*(239-i)+4*j+1];
                TblImage[ID_Bmp].points[i][j].B            = B = lpBits[4*320*(239-i)+4*j];
                
                // Calcul la couleur
                TblImage[ID_Bmp].points[i][j].Couleur    = R + 256*G + 256*256*B;
            }
    
    
        // Fait le ménage
        free(lpBits);
        DeleteObject(hbmp);
        DeleteDC(memdc);
    }

    J'ai la possibilité de copier coller ce dore, mais ça ça m'intéresse pas ... Je veux comprendre ce que je fais.


    merci pour tout aide
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

Discussions similaires

  1. Quelle taille pour mes partitions sur serveur mail ?
    Par EvilAngel dans le forum Réseau
    Réponses: 2
    Dernier message: 25/12/2006, 21h38
  2. Quelle taille pour un template fixe
    Par mohamed2006 dans le forum Webdesign & Ergonomie
    Réponses: 5
    Dernier message: 04/12/2006, 15h59
  3. Réponses: 6
    Dernier message: 02/11/2006, 19h27
  4. Quelles définitions pour la taille d'une base
    Par Christophe Charron dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 15/09/2005, 07h59
  5. Quelle taille pour un int ?
    Par elitost dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 14/02/2005, 08h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo