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 :

Capture de l'écran


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 33
    Points : 12
    Points
    12
    Par défaut Capture de l'écran
    Bonjour,

    Je voudrai créer une bmp et l'enregistrer dans un fichier à partir de la fonction PrintWindow ou autre qui permet de capturer l'écran.
    Je ne sais pas trop bien comment je dois faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HDC hdcScreen=GetDC(NULL);
    HDC hdcCompatible = CreateCompatibleDC(hdcScreen);
    HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen, 1280, 1024);
    
    SelectObject(hdcCompatible, hbmScreen);
    
    BitBlt(hdcCompatible, 0, 0, 1280, 1024, hdcScreen, 0,0, SRCCOPY);

    J'aimerai au final pouvoir enregistrer l'image dans un fichier.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    MSDN->
    Capturing an Image
    http://msdn.microsoft.com/en-us/libr...14(VS.85).aspx


    Storing an Image
    http://msdn.microsoft.com/en-us/libr...40(VS.85).aspx

    Tu peux passer sinon par l'interface COM IPicture ou bien des libs comme CxImage

    Sinon si tu as VC2008 tu peux passer par gdiplus ce qui sera plus simple peut-être

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 33
    Points : 12
    Points
    12
    Par défaut
    Merci Mat.M pour ta réponse.

    Je vais revoir encore 1 fois dans la doc.
    Mais par contre, j'ai une autre question si il n'y a t-il pas moyen de lire les pixels de l'écran sans en créer une image et que ça soit optimisé?

    Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par greg1517 Voir le message
    Merci Mat.M pour ta réponse.

    Je vais revoir encore 1 fois dans la doc.
    Mais par contre, j'ai une autre question si il n'y a t-il pas moyen de lire les pixels de l'écran sans en créer une image et que ça soit optimisé?

    Merci d'avance.

    Oui avec GetDIBBits() Voir le MSDN

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 33
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Ca ne marche toujours pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        HDC hdcScreen2=CreateCompatibleDC(hdcScreen);
        HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen,
                         GetDeviceCaps(hdcScreen, HORZRES),
                         GetDeviceCaps(hdcScreen, VERTRES));
        SelectObject(hdcScreen2, hbmScreen);
        BITMAPINFO structure;
        GetDIBits(hdcScreen2, hbmScreen, 0, 1280*1024, &buff, &structure, DIB_RGB_COLORS);
    GetDIBIts renvoit 0.

    Merci d'avance.

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    euuhh pourquoi 1280*1024 et codé en dur ?
    c'est normal la structure de type BITMAPINFO n'est pas initialisée.
    REgarde bien l'exemple du MSDN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, 
            DIB_RGB_COLORS))

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 33
    Points : 12
    Points
    12
    Par défaut
    Merci encore à toi Mat.M

    Je l'ai mis direct pour tester que ça marche mais apparement, c'est pas l'argument attendu maintenant que je commence doucement à comprendre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        PBITMAPINFO pbi;
        PBITMAPINFOHEADER pbih;
        pbih->biSize=sizeof(BITMAPINFOHEADER);
        pbih->biWidth=1280;
        pbih->biHeight=1024;
        pbih->biPlanes=1;
        pbih->biBitCount=24;
        pbih->biCompression=BI_RLE8;
    
    //Que faire du pbi?
    
    GetDIBits(hdcScreen2, hbmScreen, 0, (WORD) pbih->biHeight, buff, pbi, DIB_RGB_COLORS);
    Je ne sais pas trop comment je dois l'initialiser... (pour les valeurs en dur, c'est temporaire juste pour voir si ça marche mais je les modifirai plus tard bien sûr)

    Merci d'avance.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Le BITMAPINFO me semble-t-il c'est pour écrire un entête de128 octets dans le fichier bmp qui donne la profondeur de pixels hauteur largeur etc et puis une table des couleurs RGBA
    The BITMAPINFO structure defines the dimensions and color information for a Windows device-independent bitmap (DIB).

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 33
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Le BITMAPINFO me semble-t-il c'est pour écrire un entête de128 octets dans le fichier bmp qui donne la profondeur de pixels hauteur largeur etc et puis une table des couleurs RGBA
    Ok...
    Je comprend, je vais voir ça.

Discussions similaires

  1. Capture de l'écran du client
    Par kawthar dans le forum ASP.NET
    Réponses: 0
    Dernier message: 16/09/2010, 11h57
  2. Débutant: capturer une zone écran numérique
    Par alphanet dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 15/12/2007, 01h00
  3. Réponses: 4
    Dernier message: 30/05/2005, 10h29
  4. [C#] Capture écran dans pictureBox
    Par Gauden dans le forum Windows Forms
    Réponses: 5
    Dernier message: 05/05/2004, 10h18
  5. Réponses: 10
    Dernier message: 10/10/2003, 14h25

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