关闭

VC 杂乱笔记 2

753人阅读 评论(0) 收藏 举报

保存位图

BOOL SaveBmp(HBITMAP hBitmap, CHAR FileName[])
{
      //设备描述表
     HDC hDC;
     //当前分辨率下每象素所占字节数
      int iBits;
      //位图中每象素所占字节数
      WORD wBitCount;
     //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
     DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
     //位图属性结构
     BITMAP Bitmap; 
      //位图文件头结构
     BITMAPFILEHEADER bmfHdr;  
     //位图信息头结构
     BITMAPINFOHEADER bi; 
     //指向位图信息头结构 
     LPBITMAPINFOHEADER lpbi; 
     //定义文件,分配内存句柄,调色板句柄
     HANDLE fh, hDib, hPal,hOldPal=NULL;

     //计算位图文件每个像素所占字节数
     hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 
    DeleteDC(hDC);
    if (iBits <= 1)          wBitCount = 1;
    else if (iBits <= 4) wBitCount = 4;
    else if (iBits <= 8) wBitCount = 8; 
    else wBitCount = 24;

    GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    bi.biSize= sizeof(BITMAPINFOHEADER);
    bi.biWidth= Bitmap.bmWidth;
    bi.biHeight= Bitmap.bmHeight;
    bi.biPlanes= 1;
    bi.biBitCount= wBitCount;
    bi.biCompression= BI_RGB;
    bi.biSizeImage= 0;
    bi.biXPelsPerMeter= 0;
    bi.biYPelsPerMeter= 0;
    bi.biClrImportant= 0;
    bi.biClrUsed= 0;

   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;

   //为位图内容分配内存
   hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize +
   sizeof(BITMAPINFOHEADER));
   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
   *lpbi = bi;

   // 处理调色板 
   hPal = GetStockObject(DEFAULT_PALETTE);
   if (hPal)
   {
       hDC = ::GetDC(NULL);
       hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
       RealizePalette(hDC);
   }

    // 获取该调色板下新的像素值
   GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,  (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)            +dwPaletteSize,  (BITMAPINFO *)lpbi, DIB_RGB_COLORS);

    //恢复调色板 
    if (hOldPal)
    {
        ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
        RealizePalette(hDC);
       ::ReleaseDC(NULL, hDC);
    }  

   //创建位图文件 
   fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

   if (fh == INVALID_HANDLE_VALUE)  return FALSE;

   // 设置位图文件头
   bmfHdr.bfType = 0x4D42; // "BM"
  dwDIBSize = /*sizeof(BITMAPFILEHEADER) +*/ sizeof(BITMAPINFOHEADER) +
  dwPaletteSize + dwBmBitsSize; 
  bmfHdr.bfSize = dwDIBSize;
  bmfHdr.bfReserved1 = 0;
  bmfHdr.bfReserved2 = 0;
  bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +
   (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
   // 写入位图文件头
   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
   // 写入位图文件其余内容
   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
   //清除 
   GlobalUnlock(hDib);
   GlobalFree(hDib);
   CloseHandle(fh);

   return TRUE;
 }

利用 win32 API 写文件

void WriteLog(CHAR csMsg[], DWORD dwSize )

 HANDLE hFile;
 DWORD dwNumberOfBytesWritten;

        // 必须指定 OPEN_ALWAYS 标志, 否则不会在原文件内容上添加 
 hFile = CreateFile( _szFileName, GENERIC_WRITE,  FILE_SHARE_WRITE, NULL,  OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN,NULL );
 if (hFile == INVALID_HANDLE_VALUE )
 {
  return ;
 }
 
 // 设置文件指针到文件结尾, 在 当前位置 FILE_END, 向后移动 0 字节
 SetFilePointer( hFile , 0, NULL,  FILE_END );
  
 // 这个 API 是设置当前的位置为文件的结尾
 // SetEndOfFile( hFile);
 
 BOOL BRet = WriteFile( hFile, csMsg, dwSize , &dwNumberOfBytesWritten, NULL);
 
 CloseHandle( hFile );
}

利用 win32 API 写文件

void WriteLog(CHAR csMsg[], DWORD dwSize )

 HANDLE hFile;
 DWORD dwNumberOfBytesWritten;

// 必须指定 OPEN_ALWAYS 标志, 否则不会在原文件内容上添加 
 hFile = CreateFile( _szFileName, GENERIC_WRITE,  FILE_SHARE_WRITE, NULL,  OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN,NULL );
 if (hFile == INVALID_HANDLE_VALUE )
 {
  return ;
 }
 
 // 设置文件指针到文件结尾, 在 当前位置 FILE_END, 向后移动 0 字节
 SetFilePointer( hFile , 0, NULL,  FILE_END );
  
 // 这个 API 是设置当前的位置为文件的结尾
 // SetEndOfFile( hFile);
 
 BOOL BRet = WriteFile( hFile, csMsg, dwSize , &dwNumberOfBytesWritten, NULL);
 
 CloseHandle( hFile );
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:519985次
    • 积分:6905
    • 等级:
    • 排名:第3320名
    • 原创:156篇
    • 转载:76篇
    • 译文:12篇
    • 评论:77条
    最新评论