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 :

screenshot [FAQ]


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut screenshot
    bonjour


    je cherche des explications sur comment faire un screenshot et l'enregistrer en jpeg en C.

    si quelqu'un pouvait m'expliquer comment récupérer les données brutes après la création du HBITMAP ça serait sympa, je suis complètement paumé dans tout ce souk, et c'est bien compliqué faut dire !

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    http://www.codeguru.com/bitmap/WindowBitmap.html

    et pleins d'autres exemples :
    http://www.codeguru.com/bitmap/

  3. #3
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    salut,

    merci, j'avais déjà vu ces pages, j'y comprends RIEN DU TOUT ! en plus, le fait que tout soit en C++, ça aide pas !

    voila ce que je fais :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    HBITMAP CreateHbitmap&#40;void&#41;
    &#123;
    
      HDC hdcscreen,hdcCompatible;
      HBITMAP hbmscreen;
    
      hdcscreen=GetDC&#40;NULL&#41;;
      hdcCompatible=CreateCompatibleDC&#40;hdcscreen&#41;;
    
      /creation du bitmap compatible/
      hbmscreen=CreateCompatibleBitmap&#40; hdcscreen,
                                        GetDeviceCaps&#40;hdcscreen,HORZRES&#41;,
                                        GetDeviceCaps&#40;hdcscreen,VERTRES&#41;
                                      &#41;;
    
      /select le bitmap dans le dc compatible/
      SelectObject&#40;hdcCompatible,hbmscreen&#41;;
    
      /capture de l'image/
    
      BitBlt&#40; hdcCompatible,
              hbmscreen,
              0,
              0,
              GetDeviceCaps&#40;hdcscreen,HORZRES&#41;,
              GetDeviceCaps&#40;hdcscreen,VERTRES&#41;,
              SRCCOPY
            &#41;;
    
      return hbmscreen;
    &#125;
    normalement avec cette fonction j'ai un HBITMAP correspondant a tout mon
    écran. ok ?

    donc je regarde la doc et je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct tagBITMAP &#123;  // bm
       LONG   bmType;
       LONG   bmWidth;
       LONG   bmHeight;
       LONG   bmWidthBytes;
       WORD   bmPlanes;
       WORD   bmBitsPixel;
       LPVOID bmBits;
    &#125; BITMAP;
    je vois également dans msdn qu'avant (dans 'storing an image') de créer et
    remplir le fichier bmp, ils remplissent la BITMAPINFO structure...

    je regarde et je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct tagBITMAPINFO &#123; // bmi
       BITMAPINFOHEADER bmiHeader;
       RGBQUAD          bmiColors&#91;1&#93;;
    &#125; BITMAPINFO;
    donc ça serait cette structure qui contient les données brutes, les pixels
    (RGBQUAD), dont j'ai besoin pour faire un fichier jpeg (les rows, ou scan
    lines) c'est ça ?

    où est-ce que je peux y avoir accès avec mon HBITMAP initial ? si oui
    comment ?

    merci a vous, si vous pouvez m'éclaircir un peu sur ce sujet....

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Vi c'est vrai que c'est pas évident.
    Ce que ton code fait c'est créer un bitmap compatible avec l'écran (résolution, nb couleur) et le remplir (bitblt).
    Donc tu as un DDB = device dependant bitmap.
    Les DDB sont performants car y'a rien à faire pour les afficher, juste copier leur contenu à l'écran. Ces bitmaps sont enregistrés dans le format du Device Context associé. (ordre des couleurs ...).
    Pour l'enregistrer sur disque, on a besoin de manipuler un format universel, indépendant de toute carte graphique ou autre. C'est le format BMP tel qu'on le trouve sur les disques. Ce type de bitmap c'est un DIB = Device Independant Bmp. Faut donc convertir ton HBITMAP en DIB, et alors tu peux l'enregistrer.
    Tout ça est assez bien expliqué ici :
    http://www.codeproject.com/bitmap/gditutorial.asp

  5. #5
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    bon, entre deux, j'ai fait sommairement connaissance avec la fonction GetDIBits(), elle permettrait d'extraire les bits d'un bitmap (ici de mon DDB que j'ai créé) pour les placer dans un autre buffer...

    ce que je me demande : est-il possible d'utiliser cette fonction pour placer les données de mon HBITMAP dans une structure qui servirait a etre lue par les fonction de compression jpeg ? si oui, de quelle structure sagirait-il ?

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Pour compresser en JPEG il faut utiliser une lib spéciale. Donc la méthode dépend de la lib. Tu peux utiliser GDI+ qui est en C++. Ca simpliefiera au passage ton code de création de bitmap. Si tu veux rester en C, faut voir ailleurs.
    Pour sauvegarder un screenshot, je te conseille plutôt le png, qui donne de meilleurs résultats, tant en compression qu'en qualité (compression non destructrice).

  7. #7
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    re bonjour !


    bon j'ai bossé encore sur mon programme, je pense que je me rapproche du but, mais quelques choses me dérangent encore :

    1) il plante... c qd même dommage

    2) je fais certaines choses prises sur la msdn que je pige pas...

    tout ceci reste assez obscur...

    j'ai une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HBITMAP CreateHbitmap&#40;HDC *hdcCompatible,UINT *height, UINT *width&#41;
    puis j'ai recopié la fonction msdn :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PBITMAPINFO CreateBitmapInfoStruct&#40;HBITMAP hbm&#41;
    je ne comprends pas certains points cependant...

    apparement, on ne peux pas accéder aux bits avec juste un HBITMAP, j'ai donc créé la BITMAPINFO...

    cependant, j'ai toujours ici un DDB, donc je vais utiliser la fonction GetDIBits() pour extraire les bits et les placer dans le buffer de mon choix...

    voici ce que je ne comprend pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int GetDIBits&#40;
    
        HDC hdc,	// handle of device context 
        HBITMAP hbmp,	// handle of bitmap 
        UINT uStartScan,	// first scan line to set in destination bitmap  
        UINT cScanLines,	// number of scan lines to copy 
        LPVOID lpvBits,	// address of array for bitmap bits 
        LPBITMAPINFO lpbi,	// address of structure with bitmap data 
        UINT uUsage 	// RGB or palette index 
       &#41;;

    1) pourquoi cette fonction a-t-elle besoin du device context mémoire ?

    2) vu que j'ai dû remplir ma BITMAPINFO au préalable pour accéder aux données, pourquoi la fonction me demande-t-elle encore le HBITMAP ?

    3)LPVOID lpvBits est mon buffer destination des bits extraits... puis-je utiliser le JSAMPLE *image_buffer de la libjpeg pour stocker tout ça ?

    4) si je peux j'alloue la mémoire pour lui de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JSAMPLE *image_buffer=malloc&#40;sizeof&#40;pbmi->bmiHeader.biSizeImage&#41;&#41;;
    qu'en dire ?

    5) enfin dernière question du moment, les bits dans le bitmap sont apparement rangés du bas vers le haut, ceux du jpeg doivent l'etre dans l'autre sens... faut-il les inverser dans le buffer ou écrit GetDIBits ? ou bien écrire a l'envers au moment de la compression jpeg ?


    merci d'avance pour l'aide

    mon fichier.c actuel est ici : http://nicolas.aunai.free.fr/screenshot/

  8. #8
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    un grand MERCI a tous pour votre aide précieuse ! j'ai enfin réussi mon programme qui fait un screenshot en jpeg !

    pour ceux que ça intéresse j'ai mis les sources ici : http://nicolas.aunai.free.fr/screenshot

    a+

  9. #9
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ah ok ... je trouvais ça bizarre qu'un mec fasse la même chose que toi sur les newsgroups

  10. #10
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    lol ! et ouais les ng et les forums de developpez.com sont mes cibles lorsque je ne comprend pas qqch

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Screenshot d'une page Web ?
    Par ParMesSoins dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 18/01/2008, 10h13
  2. screenshot en C
    Par momow dans le forum Windows
    Réponses: 3
    Dernier message: 14/02/2004, 03h56
  3. screenshot dans une résolution > a celle affichée
    Par cemoi dans le forum DirectX
    Réponses: 8
    Dernier message: 29/12/2003, 18h16
  4. prise rapide de screenshot
    Par cemoi dans le forum DirectX
    Réponses: 12
    Dernier message: 24/11/2003, 14h12
  5. Screenshot
    Par rellik dans le forum Composants VCL
    Réponses: 8
    Dernier message: 05/08/2003, 12h28

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