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

 C Discussion :

Enregistrement screenshot du presse papier vers un fichier monochrome


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 60
    Par défaut Enregistrement screenshot du presse papier vers un fichier monochrome
    Bonjour a tous ,

    J ai voulu il y a quelque temps écrire un programme capable de prendre des screenshot. Après quelques recherche sur internet. J ai trouver le moyen d y arriver. je simule une pression sur la touche print-screen grace a Key_Event.
    Ensuite j' enregistre le contenu du presse papier dans un fichier bmp grace a une fonction que j ai pu trouvé lors de mes recherches. Maintenant J' aimerai enregistrer le fichier en monochrôme. J ai essayer de changer un peu les valeurs que je mettais dans la structure bmih mais ca ne marche pas toute aide est la bienvenue.

    Voici le code de la fonction:

    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
    96
    97
    98
    BOOL clip2bmp(LPCTSTR pszFileBMP)
    {
      HDC              hdcMem;
      HDC              hdcScr;
      HBITMAP          hBitmap;
      HBITMAP          hBitOld;  
      BITMAP           bm;
      BITMAPINFO       bmi;
      BITMAPFILEHEADER bfh;  
      BITMAPINFOHEADER bmih;
      HANDLE           hFile;
      LPBYTE           pPixels;
      DWORD            dwBytes;   
      DWORD            dwTmp;
     
      if(OpenClipboard(NULL))
      {
        hBitmap = (HBITMAP) GetClipboardData(CF_BITMAP);
        CloseClipboard();
      }
      else
        return FALSE;
     
      if(!hBitmap)
        return FALSE;
     
      if(!GetObject(hBitmap, sizeof(bm), &bm))
        return FALSE;
     
      hdcScr  = GetDC(NULL);
      hdcMem  = CreateCompatibleDC(hdcScr);
      hBitOld = (HBITMAP) SelectObject(hdcMem, hBitmap);
     
      ZeroMemory(&bmih, sizeof(bmih));       
      bmih.biSize          = sizeof(BITMAPINFOHEADER);
      bmih.biWidth         = bm.bmWidth;  
      bmih.biHeight        = bm.bmHeight; 
      bmih.biBitCount      = bm.bmBitsPixel; 
      bmih.biCompression   = BI_RGB ;
      bmih.biPlanes        = 1; 
      bmi.bmiHeader        = bmih;
     
      dwBytes = bmih.biWidth * bmih.biHeight * (bmih.biBitCount / 8);
     
      if(!(pPixels = (LPBYTE) GlobalAlloc(GMEM_FIXED, dwBytes))){
    	  MessageBox(NULL,"Erreur!!! STRUCTURE","test",MB_OK);
    	  goto Erreur;                     }
     
      if(!GetDIBits(hdcMem, hBitmap, 0, (UINT) bmih.biHeight, pPixels, &bmi, DIB_RGB_COLORS)){
    	  MessageBox(NULL,"Erreur!!! STRUCTURE2","test",MB_OK);
    	  goto Erreur;                     }
     
     
      bfh.bfType      = 0x4d42; 
      bfh.bfOffBits   = (DWORD) sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);   
      bfh.bfSize      = (DWORD) sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwBytes;
      bfh.bfReserved1 = bfh.bfReserved2 = 0; 
     
      hFile = CreateFile(pszFileBMP, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
     
      if(hFile == INVALID_HANDLE_VALUE) {
    	  MessageBox(NULL,"Erreur!!!","test",MB_OK);
    	  goto Erreur;                     }       
     
      if(!WriteFile(hFile, (LPVOID) &bfh, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL)){
    	  MessageBox(NULL,"Erreur!!!","test",MB_OK);
    	  goto Erreur;                     }       
     
       if(!WriteFile(hFile, (LPVOID) &bmih, sizeof(BITMAPINFOHEADER), (LPDWORD) &dwTmp, NULL)){
    	  MessageBox(NULL,"Erreur!!!","test",MB_OK);
    	  goto Erreur;                     }       
     
       if(!WriteFile(hFile, (LPVOID) pPixels, dwBytes, (LPDWORD) &dwTmp, NULL)){
    	  MessageBox(NULL,"Erreur!!!","test",MB_OK);
    	  goto Erreur;                     }       
     
     
     
      GlobalFree(pPixels);  
      CloseHandle(hFile);
      SelectObject(hdcMem, hBitOld);
      ReleaseDC(NULL, hdcScr);
      DeleteDC(hdcMem);
      return TRUE;
     
    Erreur:
      if(pPixels) 
        GlobalFree(pPixels);  
      if(hFile)
      { 
        CloseHandle(hFile);
        DeleteFile(pszFileBMP);
      }    
      SelectObject(hdcMem, hBitOld);
      ReleaseDC(NULL, hdcScr);
      DeleteDC(hdcMem); 
      return FALSE; 
    }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    On peut voir une image monochrome de deux façons :
    Une première réelle : chaque pixel est codé sur 8 bits.
    Une second simulée : l'image est une image RVB, chaque pixel est codé sur 3x8 bits, mais chaque composante d'un pixel est égal aux deux autres.

    On peut donc commencer par transformer l'image RVB en image RVB grise, pour cela, il suffit de transformer chaque pixel RVB en son équivalent lumineux :

    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
        {
            /* en général, les pixels sont alignés sur 4 octets */
            size_t align = 4;
            size_t i;
            for(i = 0; i < dwBytes / align; ++i){
                pPixels[align*i+0] =
                pPixels[align*i+1] = 
                pPixels[align*i+2] =
                    (BYTE)(  .3 * pPixels[align*i+0] 
                           + .6 * pPixels[align*i+1]
                           + .1 * pPixels[align*i+2]); 
            }
        }
     
        if (!WriteFile
            (hFile, (LPVOID) pPixels, dwBytes, (LPDWORD) & dwTmp, NULL)) {
            MessageBox(NULL, "Erreur!!!", "test", MB_OK);
            goto Erreur;
        }
    Après, il faut savoir que le format bmp ne supporte pas le mode niveau de gris. En revanche, il peut travailler avec des palettes, on peut donc, pour avoir une image niveau de gris 1x8 bits, ajouter une palette de gris (0-> (0,0,0)... 255->(255,255,255)).

    Mais c'est une autre histoire.

Discussions similaires

  1. copier coller et fenetre enregistrer ou supprimer presse papier
    Par VELO1222 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/01/2011, 22h47
  2. Réponses: 2
    Dernier message: 14/03/2010, 17h24
  3. [AC-2003] Message d'enregistrement dans le presse-papiers
    Par Marc_27 dans le forum IHM
    Réponses: 3
    Dernier message: 16/02/2009, 14h03
  4. Réponses: 1
    Dernier message: 29/09/2007, 09h46
  5. Enregistrer contenu XML en mémoire vers un fichier
    Par kingmandrax dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 26/10/2006, 10h24

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