[MFC] Enregistrement d'une image affichée à l'écran . . .

Enregistrement d'une image affichée à l'écran . . . [MFC] - C++ - Programmation

Marsh Posté le 23-02-2004 à 14:41:13    

J'ai réalisé un prog. qui affiche (dans une fenetre) un flux d'image qu'il recoit par le proto. TCP.
Je cherche le moyen d'enregistrer à n'importe quel moment l'image qui est affichée à cet instant.
 
Pour ce qui est de l'affichage, j'utilise les fct  
 
LoadImage()
GetObject()
SelectObject()
StretchBlt()
 
et une instance de la classe CPaintDC.
 
L'image affichée à l'instant 't' à l'écran est passer en paramètre à la fct.  
LoadImage(NULL, "MON_IMAGE.BMP", IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
 
Je cherche le moyen que dès lorsque j'appui sur un bouton "SaveImage" (par ex.), l'image affichée à cet instant soit sauvegardée.
 
Une solution ?

Reply

Marsh Posté le 23-02-2004 à 14:41:13   

Reply

Marsh Posté le 23-02-2004 à 15:09:30    

        Salut,
 
 
    Faut créer une bitmap, c'est le plus simple a faire, je dois avoir un exemple qaui traine.............
 

Code :
  1. Save()
  2. {
  3. int iColor   = GetBitColor(); // Fonction qui donne le nombre de bit voulut -> met 24
  4. DWORD dwSize  = m_ImageSizeX * m_ImageSizeY * iColor;
  5. DWORD dwTmp   = 0;
  6. BITMAPFILEHEADER hdr;
  7. HANDLE hf   = NULL;
  8. BITMAPINFO *pBitmap = NULL;
  9. if (iColor == DEF_NB_COLOR_8)
  10. {
  11.  LOGPALETTE* plp = NULL;
  12.  plp = (LOGPALETTE *)malloc (sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY));
  13.  plp->palVersion    = 0x0300;
  14.  plp->palNumEntries = 256;
  15.  for (int i = 0; i < 256; i++)
  16.  {
  17.   // Creation d'une palette 256 niveau de gris
  18.   plp->palPalEntry[i].peRed   = i;
  19.   plp->palPalEntry[i].peGreen = i;
  20.   plp->palPalEntry[i].peBlue  = i;
  21.   plp->palPalEntry[i].peFlags = 0;
  22.  }
  23.  pBitmap = (BITMAPINFO*) malloc(sizeof(BITMAPINFO)+256*sizeof(RGBQUAD));
  24.  memset(pBitmap, 0, sizeof(BITMAPINFO));
  25.  memcpy(pBitmap->bmiColors, plp->palPalEntry, 256*sizeof(RGBQUAD));
  26.  free(plp);
  27.  pBitmap->bmiHeader.biClrUsed = 256;
  28.  pBitmap->bmiHeader.biClrImportant = 0;
  29.  hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"  
  30.  // Compute the size of the entire file.  
  31.  hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + (256 * sizeof(RGBQUAD)) + dwSize);
  32.  hdr.bfReserved1 = 0;
  33.  hdr.bfReserved2 = 0;
  34.  // Compute the offset to the array of color indices.  
  35.  hdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + (256 * sizeof(RGBQUAD)));
  36. }
  37. else
  38. {
  39.  pBitmap = (BITMAPINFO*) malloc(sizeof(BITMAPINFO));
  40.  memset(pBitmap,0,sizeof(BITMAPINFO));
  41.  hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"  
  42.  // Compute the size of the entire file.  
  43.  hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + dwSize);
  44.  hdr.bfReserved1 = 0;
  45.  hdr.bfReserved2 = 0;
  46.  // Compute the offset to the array of color indices.  
  47.  hdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO)) ;
  48. }
  49. pBitmap->bmiHeader.biBitCount  = 8 * iColor;
  50. pBitmap->bmiHeader.biPlanes   = 1;
  51. pBitmap->bmiHeader.biHeight   = m_ImageSizeY;
  52. pBitmap->bmiHeader.biWidth   = m_ImageSizeX;
  53. pBitmap->bmiHeader.biSizeImage  = dwSize;
  54. pBitmap->bmiHeader.biSize   = sizeof(BITMAPINFOHEADER);
  55. pBitmap->bmiHeader.biCompression = BI_RGB;
  56. // Create the .BMP file.  
  57. hf = CreateFile(csFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  58. if (hf != INVALID_HANDLE_VALUE)
  59. {
  60.  BOOL bDetruire = TRUE;
  61.  // Copy the BITMAPFILEHEADER into the .BMP file.  
  62.  WriteFile(hf, (LPVOID)&hdr, sizeof(BITMAPFILEHEADER), (LPDWORD)&dwTmp,  NULL);
  63.  if (dwTmp == sizeof(BITMAPFILEHEADER))
  64.  {
  65.   // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.  
  66.   if (iColor == DEF_NB_COLOR_8)
  67.   {
  68.    WriteFile(hf, (LPVOID)pBitmap, sizeof(BITMAPINFO) + (256 * sizeof(RGBQUAD)), &dwTmp, NULL);
  69.   }
  70.   else
  71.   {
  72.    WriteFile(hf, (LPVOID)pBitmap, sizeof(BITMAPINFO), &dwTmp, NULL);
  73.   }
  74.   if (dwTmp == (iColor == DEF_NB_COLOR_8 ? sizeof(BITMAPINFO) + (256 * sizeof(RGBQUAD)) : sizeof(BITMAPINFO)))
  75.   {
  76.    // Copy the array of color indices into the .BMP file.  
  77.    WriteFile(hf, m_pImage->GetImagePtr(), dwSize, &dwTmp, NULL);
  78.    if (dwTmp == dwSize)
  79.    {
  80.     bRet  = TRUE;
  81.     bDetruire = FALSE;
  82.    }
  83.    else if (!bQuiet)
  84.    {
  85.     AfxMessageBox("Impossible d'écrire les données de l'image.", MB_ICONSTOP);
  86.    }
  87.   }
  88.   else if (!bQuiet)
  89.   {
  90.    AfxMessageBox("Impossible d'écrire les informations de la palette dans l'image.", MB_ICONSTOP);
  91.   }
  92.  }
  93.  else if (!bQuiet)
  94.  {
  95.   AfxMessageBox("Impossible d'écrire l'entête de l'image.", MB_ICONSTOP);
  96.  }
  97.  // Close the .BMP file.  
  98.  CloseHandle(hf);
  99.  if (bDetruire)
  100.  {
  101.   DeleteFile(csFile);
  102.  }
  103. }
  104. free(pBitmap);
  105. }
  106. Load()
  107. {
  108. if (m_pPicture)
  109. {
  110.  m_pPicture->Release();
  111.  m_pPicture = NULL;
  112. }
  113. // handle sur le fichier selectionné
  114. HANDLE hFile = CreateFile(csFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
  115. if (INVALID_HANDLE_VALUE != hFile)
  116. {
  117.  // Taille du fichier
  118.  DWORD dwFileSize = GetFileSize(hFile, NULL);
  119.  if (-1 != dwFileSize)
  120.  {
  121.   // allouer la memoire a partir de la taille du fichier
  122.   HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
  123.   if (hGlobal)
  124.   {
  125.    LPVOID pvData = GlobalLock(hGlobal);
  126.    if (pvData)
  127.    {
  128.     DWORD dwBytesRead = 0;
  129.     // lecture du fichier et stockage dans la memoire
  130.     BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
  131.     GlobalUnlock(hGlobal);
  132.     if (bRead)
  133.     {
  134.      LPSTREAM pstm = NULL;
  135.      // creation IStream* a partir de la memoire
  136.      HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
  137.      if(SUCCEEDED(hr) && pstm)
  138.      {
  139.       // Creation IPicture a partit du du flux IStream*
  140.       hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&m_pPicture);
  141.       if (SUCCEEDED(hr) && m_pPicture)
  142.       {
  143.        short sType;
  144.        hr = m_pPicture->get_Type(&sType);
  145.        if (SUCCEEDED(hr))
  146.        {
  147.         if (sType == PICTYPE_BITMAP)
  148.         {
  149.          HBITMAP hBitmap;
  150.          hr = m_pPicture->get_Handle((OLE_HANDLE *) &hBitmap);
  151.          if (SUCCEEDED(hr) && hBitmap)
  152.          {
  153.           RedrawWindow();
  154.          }
  155.         }
  156.        }
  157.       }
  158.       pstm->Release();
  159.      }
  160.     }
  161.     else if (!bQuiet)
  162.     {
  163.      AfxMessageBox("Impossible de lire le fichier image.", MB_ICONSTOP);
  164.     }
  165.    }
  166.    GlobalFree(hGlobal);
  167.   }
  168.  }
  169.  CloseHandle(hFile);
  170. }
  171. }


---------------
La raison du plus fort est toujours la plus forte.... Parce que c'est comme ça NA !
Reply

Marsh Posté le 23-02-2004 à 17:07:15    

En effet, c'était pas très compliquer ;)
Merci pour ton source...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed