当前位置:编程学习 > C/C++ >>

在bmp上添加字符

 
//打开位图文件,得到位图句柄
  HBITMAP OpenBmpFile(HDC hDC, LPSTR lpszFileName)
  {
      HBITMAP hBmp = NULL;
      //读位图文件,得到位图句柄
      HANDLE hFile = CreateFile(
          lpszFileName,
          GENERIC_READ,
          FILE_SHARE_READ,
          NULL,
          OPEN_EXISTING,
          FILE_ATTRIBUTE_NORMAL,
          NULL);
      if(hFile == INVALID_HANDLE_VALUE)
          return NULL;
      //读位图文件头
      BITMAPFILEHEADER bmpFileHeader;
      DWORD dwNumberOfBytesRead;
      if(ReadFile(hFile, (LPVOID)&bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwNumberOfBytesRead, NULL) == 0)
      {   
          CloseHandle(hFile);
          return NULL;
      }
      //读位图信息
      BITMAPINFO *pBmpInfo = new BITMAPINFO;
      if(ReadFile(hFile, pBmpInfo, sizeof(BITMAPINFOHEADER), &dwNumberOfBytesRead, NULL) == 0)
      {   
          CloseHandle(hFile);
          return NULL;
      }
      //读位图数据
      LPVOID pBmpData;
      //创建DIB位图句柄
      hBmp = CreateDIBSection(hDC, pBmpInfo, DIB_PAL_COLORS, &pBmpData, NULL, 0);
      if(hBmp == NULL)
      {
          DWORD dwErr = GetLastError();
          return NULL;
      }
      else  //读位图数据
          if(ReadFile(hFile, pBmpData, pBmpInfo->bmiHeader.biSizeImage, &dwNumberOfBytesRead, NULL) == 0)
          {   
              CloseHandle(hFile);
              return NULL;
          }       
      CloseHandle(hFile); 
      return hBmp;
  }
   
  //下面的代码是把一张位图保存于文件中,参考MSDN
  PBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp)
  { 
      BITMAP bmp; 
      PBITMAPINFO pbmi; 
      WORD    cClrBits; 
   
      // Retrieve the bitmap's color format, width, and height. 
      if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) 
          return NULL;
   
      // Convert the color format to a count of bits. 
      cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); 
      if (cClrBits == 1) 
          cClrBits = 1; 
      else if (cClrBits <= 4) 
          cClrBits = 4; 
      else if (cClrBits <= 8) 
          cClrBits = 8; 
      else if (cClrBits <= 16) 
          cClrBits = 16; 
      else if (cClrBits <= 24) 
          cClrBits = 24; 
      else cClrBits = 32; 
   
      // Allocate memory for the BITMAPINFO structure. (This structure 
      // contains a BITMAPINFOHEADER structure and an array of RGBQUAD 
      // data structures.) 
  
      if (cClrBits != 24) 
          pbmi = (PBITMAPINFO) LocalAlloc(LPTR, 
                     sizeof(BITMAPINFOHEADER) + 
                     sizeof(RGBQUAD) * (1<< cClrBits)); 
  
      // There is no RGBQUAD array for the 24-bit-per-pixel format. 
  
      else 
          pbmi = (PBITMAPINFO) LocalAlloc(LPTR, 
                     sizeof(BITMAPINFOHEADER)); 
  
     // Initialize the fields in the BITMAPINFO structure. 
  
     pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
     pbmi->bmiHeader.biWidth = bmp.bmWidth; 
     pbmi->bmiHeader.biHeight = bmp.bmHeight; 
     pbmi->bmiHeader.biPlanes = bmp.bmPlanes; 
     pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; 
     if (cClrBits < 24) 
         pbmi->bmiHeader.biClrUsed = (1<<cClrBits); 
  
     // If the bitmap is not compressed, set the BI_RGB flag. 
     pbmi->bmiHeader.biCompression = BI_RGB; 
  
     // Compute the number of bytes in the array of color 
     // indices and store the result in biSizeImage. 
     // For Windows NT/2000, the width must be DWORD aligned unless 
     // the bitmap is RLE compressed. This example shows this. 
     // For Windows 95/98, the width must be WORD aligned unless the 
     // bitmap is RLE compressed.
     pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
                                   * pbmi->bmiHeader.biHeight; 
     // Set biClrImportant to 0, indicating that all of the 
     // device colors are important. 
      pbmi->bmiHeader.biClrImportant = 0; 
      return pbmi; 
  } 
  
 void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, 
                   HBITMAP hBMP, HDC hDC) 
  { 
      HANDLE hf;     &n
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,