VC 杂乱笔记 2

保存位图

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blue_Dream_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值