程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 在bmp上添加字符

在bmp上添加字符

編輯:C++入門知識

  //打開位圖文件,得到位圖句柄   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); }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved