• 在bmp上添加字符 分类: VC++ 2013-09-09 14:40 822人阅读 评论(3) 收藏



    //打开位图文件,得到位图句柄
      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;                 // file handle
         BITMAPFILEHEADER hdr;       // bitmap file-header
         PBITMAPINFOHEADER pbih;     // bitmap info-header
         LPBYTE lpBits;              // memory pointer
         DWORD dwTotal;              // total count of bytes
         DWORD cb;                   // incremental count of bytes
         BYTE *hp;                   // byte pointer
         DWORD dwTmp;
     
         pbih = (PBITMAPINFOHEADER) pbi;
         lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
     
         if (!lpBits)
              return ;
     
         // Retrieve the color table (RGBQUAD array) and the bits
         // (array of palette indices) from the DIB.
         if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
             DIB_RGB_COLORS))
         {
             return ;
         }
     
         // Create the .BMP file.
         hf = CreateFile(pszFile,
                        GENERIC_READ | GENERIC_WRITE,
                        (DWORD) 0,
                         NULL,
                        CREATE_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL,
                        (HANDLE) NULL);
         if (hf == INVALID_HANDLE_VALUE)
             return ;
         hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"
         // Compute the size of the entire file.
         hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
                      pbih->biSize + pbih->biClrUsed
                      * sizeof(RGBQUAD) + pbih->biSizeImage);
         hdr.bfReserved1 = 0;
         hdr.bfReserved2 = 0;
     
         // Compute the offset to the array of color indices.
         hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
                         pbih->biSize + pbih->biClrUsed
                        * sizeof (RGBQUAD);
     
        // Copy the BITMAPFILEHEADER into the .BMP file.
        if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
            (LPDWORD) &dwTmp,  NULL))
         {
            return ;
         }
     
       // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
        if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
                      + pbih->biClrUsed * sizeof (RGBQUAD),
                      (LPDWORD) &dwTmp, ( NULL)))
            return ;
     
         // Copy the array of color indices into the .BMP file.
         dwTotal = cb = pbih->biSizeImage;
         hp = lpBits;
         if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
               return ;
     
         // Close the .BMP file.
          if (!CloseHandle(hf))
                return ;
    GlobalFree((HGLOBAL)lpBits);
    }


    void CTextOnbmpDlg::OnButton1()
    {
     // TODO: Add your control notification handler code here
        // TODO: Add your control notification handler code here   
    HDC hDC = ::GetDC(GetSafeHwnd());
    HDC hMemDC = CreateCompatibleDC(hDC);
    //打开位图文件
    HBITMAP hBmp = OpenBmpFile(hDC, "d:\temp\6370烧写\6484884.bmp");
    SelectObject(hMemDC, hBmp);
    //在位图上写字
    RECT rect = {50, 50, 200, 200};
    SetBkMode(hMemDC, TRANSPARENT);
    DrawText(hMemDC, "你好", -1, &rect, DT_VCENTER);
    //保存位图到文件
    PBITMAPINFO pBmpInfo = CreateBitmapInfoStruct(GetSafeHwnd(), hBmp);
    CreateBMPFile(GetSafeHwnd(), "Test.bmp", pBmpInfo, hBmp, hDC);
    DeleteDC(hMemDC);
    DeleteObject(hBmp);

    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    04.sys
    leetcode算法-加油站
    Spring动态AOP
    (java反射-JDK动态代理)+CGLIB动态代理
    java反射-基础语法
    leetcode算法-验证回文串
    leetcode算法-盛最多水的容器
    leetcode算法-两数之和
    leetcode算法-三数之和
    leetcode算法-最长和谐子序列
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706812.html
Copyright © 2020-2023  润新知