zoukankan      html  css  js  c++  java
  • VC/MFC怎样将位图CBitmap对象保存成为bmp格式文件? from http://coding1688.iteye.com/blog/1547035

    VC/MFC怎样将位图CBitmap对象保存成为bmp格式文件?

    虽然说现在写程序主要依靠 Internet ,特别是 Google 搜索(不过有时候 被墙,只能凑合着用百度)。编程技术人员的普遍经验都是:Google 在搜索技术资料的时候确实比 百度 要强。

    废话少说,今晚找了些资料,终于搞定了 将CBitmap表示的位图对象保存成为正宗的 bmp 格式文件。不过其中有些小的曲折,总结一下,网上大体提供了以下几种方式:

    1. 用 CImage 来解决,就几行,但需要 .net 支持;

    Cpp代码  收藏代码
    1. // http://blog.csdn.net/benpluslib/article/details/3975774  
    2. // 使用下面的代码,可以把CBitmap类中的图像保存到图像文件中。支持格式:BMP、JPG、GIF和PNG。   
    3. // 但CImage只在.net下有  
    4. // CImage imgTemp;      // CImage是MFC中的类。  
    5. // imgTemp.Attach(Bitmap.operator HBITMAP());  
    6. // imgTemp.Save(strFilePath);  

     

    2. 很多网站提供的 void WriteBmp(CBitmap   *PBitmap, char m_FileName[])  原代码,要放在 某个 Windows 类中作为成员函数才行。但很不幸,不怎么灵。

    Cpp代码  收藏代码
    1. // http://blog.csdn.net/xs813/article/details/6321924  
    2. // 保存CBitmap到文件   
    3. // 经过测试,这个方法是不灵的:  
    4. // 有时候能正确保存,  
    5. // 有时候保存之后打开报“绘图失败”,  
    6. // 有时候程序执行非法操作  
    7. void CTestClipboardDlg::WriteBmp(CBitmap   *PBitmap, char m_FileName[])     
    8. // 代码省略,网上有(既然不灵,也就没必要贴出来了)  
    9.   
    10. // 调用方式  
    11.                 //WriteBmp(cbm, "clipboard1.bmp");  // 这个方法不行  

     

    3. 也还有 bool SaveBitmapToFile(CBitmap* bitmap, LPSTR lpFileName) 此方法甚好,就用它了。下面贴出完整的经本人辛苦格式化的代码,再此向作者致敬(虽然原作者已无从考证)。

    Cpp代码  收藏代码
    1. // http://blog.sina.com.cn/s/blog_6ee382440100moeu.html  
    2. // http://apps.hi.baidu.com/share/detail/32878068  
    3. // bitmap 位图CBitmap对象指针  
    4. // lpFileName 为位图文件名    
    5. bool SaveBitmapToFile(CBitmap* bitmap, LPSTR lpFileName)  
    6. {              
    7.     HBITMAP hBitmap;    // 为刚才的屏幕位图句柄  
    8.     HDC hDC; //设备描述表    
    9.     int iBits; //当前显示分辨率下每个像素所占字节数    
    10.     WORD wBitCount; //位图中每个像素所占字节数    
    11.     DWORD dwPaletteSize = 0, //定义调色板大小  
    12.         dwBmBitsSize,  //位图中像素字节大小     
    13.         dwDIBSize,   //位图文件大小  
    14.         dwWritten;  //写入文件字节数  
    15.     BITMAP Bitmap; //位图属性结构    
    16.     BITMAPFILEHEADER bmfHdr; //位图文件头结构    
    17.     BITMAPINFOHEADER bi; //位图信息头结构      
    18.     LPBITMAPINFOHEADER lpbi; //指向位图信息头结构    
    19.     HANDLE fh,   //定义文件  
    20.         hDib,    //分配内存句柄  
    21.         hPal,   //调色板句柄  
    22.         hOldPal = NULL;  
    23.       
    24.     //计算位图文件每个像素所占字节数    
    25.     hBitmap = (HBITMAP)*bitmap;    
    26.     hDC = CreateDC("DISPLAY",NULL,NULL,NULL);    
    27.     iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);    
    28.     DeleteDC(hDC);  
    29.       
    30.     if (iBits <= 1)    
    31.         wBitCount = 1;    
    32.     else if (iBits <= 4)    
    33.         wBitCount = 4;    
    34.     else if (iBits <= 8)    
    35.         wBitCount = 8;    
    36.     else if (iBits <= 24)    
    37.         wBitCount = 24;    
    38.     else if (iBits <= 32)  
    39.         wBitCount = 32;  
    40.       
    41.     //计算调色板大小    
    42.     if (wBitCount <= 8)    
    43.         dwPaletteSize = (1 << wBitCount) * sizeof (RGBQUAD);  
    44.       
    45.     //设置位图信息头结构    
    46.     GetObject(hBitmap, sizeof (BITMAP), (LPSTR)&Bitmap);  
    47.     bi.biSize = sizeof (BITMAPINFOHEADER);    
    48.     bi.biWidth = Bitmap.bmWidth;    
    49.     bi.biHeight = Bitmap.bmHeight;    
    50.     bi.biPlanes = 1;      
    51.     bi.biBitCount = wBitCount;    
    52.     bi.biCompression = BI_RGB;    
    53.     bi.biSizeImage = 0;    
    54.     bi.biXPelsPerMeter = 0;    
    55.     bi.biYPelsPerMeter = 0;    
    56.     bi.biClrUsed = 0;    
    57.     bi.biClrImportant = 0;    
    58.       
    59.     dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31) / 32) * 4 * Bitmap.bmHeight;    
    60.       
    61.     //为位图内容分配内存    
    62.     hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof (BITMAPINFOHEADER));    
    63.     lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);    
    64.     *lpbi = bi;  
    65.       
    66.     // 处理调色板         
    67.     hPal = GetStockObject(DEFAULT_PALETTE);    
    68.     if (hPal)    
    69.     {    
    70.         hDC = ::GetDC(NULL);      
    71.         hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);    
    72.         RealizePalette(hDC);  
    73.     }    
    74.       
    75.     //   获取该调色板下新的像素值    
    76.     GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,    
    77.         (LPSTR)lpbi + sizeof (BITMAPINFOHEADER) + dwPaletteSize,  
    78.         (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);    
    79.       
    80.     //恢复调色板       
    81.     if (hOldPal)      
    82.     {    
    83.         SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);    
    84.         RealizePalette(hDC);    
    85.         ::ReleaseDC(NULL, hDC);  
    86.     }    
    87.       
    88.     //创建位图文件              
    89.     fh = CreateFile(lpFileName, GENERIC_WRITE,  
    90.         0, NULL, CREATE_ALWAYS,  
    91.         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);    
    92.       
    93.     if (fh == INVALID_HANDLE_VALUE)  
    94.         return FALSE;    
    95.       
    96.     //   设置位图文件头    
    97.     bmfHdr.bfType = 0x4D42;     //   "BM"    
    98.     dwDIBSize = sizeof (BITMAPFILEHEADER)       
    99.         + sizeof (BITMAPINFOHEADER)    
    100.         + dwPaletteSize + dwBmBitsSize;      
    101.     bmfHdr.bfSize = dwDIBSize;    
    102.     bmfHdr.bfReserved1 = 0;    
    103.     bmfHdr.bfReserved2 = 0;    
    104.     bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER)     
    105.         + (DWORD)sizeof (BITMAPINFOHEADER)    
    106.         + dwPaletteSize;      
    107.       
    108.     //   写入位图文件头    
    109.     WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);    
    110.       
    111.     //   写入位图文件其余内容    
    112.     WriteFile(fh, (LPSTR)lpbi, dwDIBSize,  
    113.         &dwWritten, NULL);  
    114.       
    115.     //清除            
    116.     GlobalUnlock(hDib);    
    117.     GlobalFree(hDib);    
    118.     CloseHandle(fh);    
    119.   
    120.     return TRUE;      
    121. }    

    使用的方式也相当的简单。

    Cpp代码  收藏代码
    1. SaveBitmapToFile(cbm, "clipboard.bmp");  

     

    4. 其他第三方库:比如 CxImage ,现在还没有来得及研究。

    下一步准备将 CBitmap 保存为 jpg 格式,或将已保存的 bmp 格式文件 转为 jpg 格式文件。

  • 相关阅读:
    Windows环境安装tesseract-ocr 4.00并配置环境变量
    iis6手工创建网站后无法运行php脚本
    spring boot集成websocket实现聊天功能和监控功能
    spring boot2.0.4集成druid,用jmeter并发测试工具调用接口,druid查看监控的结果
    springboot2.1.5集成单节点elasticsearch6.4.0
    spring boot集成netty-服务端和客户端demo
    spring boot集成mongo统计活跃用户数
    spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例
    spring cloud分布式配置中心案例
    spring cloud--zuul网关和zuul请求过滤
  • 原文地址:https://www.cnblogs.com/songtzu/p/2842599.html
Copyright © 2011-2022 走看看