zoukankan      html  css  js  c++  java
  • 把HBITMAP 保存图片文件.

      1 //VC下把HBITMAP保存为bmp图片   
      2 BOOL  CtestBitMapDlg::SaveBmp(HBITMAP  hBitmap,   CString  FileName)         
      3 {         
      4     HDC     hDC;         
      5     //当前分辨率下每象素所占字节数         
      6     int     iBits;         
      7     //位图中每象素所占字节数         
      8     WORD     wBitCount;         
      9     //定义调色板大小,     位图中像素字节大小     ,位图文件大小     ,     写入文件字节数             
     10     DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;             
     11     //位图属性结构             
     12     BITMAP     Bitmap;                 
     13     //位图文件头结构         
     14     BITMAPFILEHEADER     bmfHdr;                 
     15     //位图信息头结构             
     16     BITMAPINFOHEADER     bi;                 
     17     //指向位图信息头结构                 
     18     LPBITMAPINFOHEADER     lpbi;                 
     19     //定义文件,分配内存句柄,调色板句柄             
     20     HANDLE     fh,   hDib,   hPal,hOldPal=NULL;   
     21 
     22     int aa = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 288 * 352 * 24 / 8;
     23 
     24     //计算位图文件每个像素所占字节数             
     25     hDC  = CreateDC("DISPLAY",   NULL,   NULL,   NULL);         
     26     iBits  = GetDeviceCaps(hDC,   BITSPIXEL)     *     GetDeviceCaps(hDC,   PLANES);             
     27     DeleteDC(hDC);             
     28     if(iBits <=  1)                                                   
     29         wBitCount = 1;             
     30     else  if(iBits <=  4)                               
     31         wBitCount  = 4;             
     32     else if(iBits <=  8)                               
     33         wBitCount  = 8;             
     34     else                                                                                                                               
     35         wBitCount  = 24;             
     36 
     37     GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);         
     38     bi.biSize= sizeof(BITMAPINFOHEADER);         
     39     bi.biWidth = Bitmap.bmWidth;         
     40     bi.biHeight =  Bitmap.bmHeight;         
     41     bi.biPlanes =  1;         
     42     bi.biBitCount = wBitCount;         
     43     bi.biCompression= BI_RGB;         
     44     bi.biSizeImage = Bitmap.bmWidth * Bitmap.bmHeight * 3;         
     45     bi.biXPelsPerMeter = 0;         
     46     bi.biYPelsPerMeter = 0;         
     47     bi.biClrImportant = 0;         
     48     bi.biClrUsed =  0;         
     49 
     50     dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;         
     51 
     52     //为位图内容分配内存             
     53     hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));             
     54     lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);             
     55     *lpbi  = bi;             
     56 
     57     //     处理调色板                 
     58     hPal  = GetStockObject(DEFAULT_PALETTE);             
     59     if (hPal)             
     60     {             
     61         hDC  = ::GetDC(NULL);             
     62         hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);             
     63         RealizePalette(hDC);             
     64     }         
     65 
     66     //     获取该调色板下新的像素值             
     67     GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,  
     68         (LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize,   
     69         (BITMAPINFO *)lpbi, DIB_RGB_COLORS);             
     70 
     71     //恢复调色板                 
     72     if (hOldPal)             
     73     {             
     74         ::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);             
     75         RealizePalette(hDC);             
     76         ::ReleaseDC(NULL,   hDC);             
     77     }             
     78 
     79     //创建位图文件                 
     80     fh  = CreateFile(FileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,           
     81         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);             
     82 
     83     if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;             
     84 
     85     //     设置位图文件头             
     86     bmfHdr.bfType  = 0x4D42;     //     "BM"             
     87     dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;                 
     88     bmfHdr.bfSize  = dwDIBSize;             
     89     bmfHdr.bfReserved1  = 0;             
     90     bmfHdr.bfReserved2  = 0;             
     91     bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;             
     92     //     写入位图文件头             
     93     WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);             
     94     //     写入位图文件其余内容             
     95     WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize - 14,   &dwWritten,   NULL);             
     96     //清除                 
     97     GlobalUnlock(hDib);             
     98     GlobalFree(hDib);             
     99     CloseHandle(fh);             
    100 
    101     return     TRUE;         
    102 }  
  • 相关阅读:
    火狐插件火狐黑客插件将Firefox变成黑客工具的七个插件
    memcache安装环境:WINDOWS 7
    PHP正则表达式
    968. 监控二叉树 力扣(困难) dfs 官方说DP
    375. 猜数字大小 II 力扣(中等) 区间动态规划、记忆化搜索
    629. K个逆序对数组 力扣(困难) 区间动态规划
    剑指 Offer 51. 数组中的逆序对 力扣(困难) 巧用归并排序算法
    488. 祖玛游戏 力扣(困难) dfs
    16. 最接近的三数之和 力扣(中等) 双指针
    319. 灯泡开关 力扣(中等) 数论
  • 原文地址:https://www.cnblogs.com/SamRichard/p/6069818.html
Copyright © 2011-2022 走看看