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 }  
  • 相关阅读:
    概率期望训练之五
    概率期望训练之四
    JavaScript Source Map详解
    JSON.parse、JSON.stringify
    Linux cp命令直接覆盖不提示方法
    Service Worker
    HTML5 应用程序缓存
    二分图
    Tarjan
    FFT迭代加深 & NTT 多项式求逆
  • 原文地址:https://www.cnblogs.com/SamRichard/p/6069818.html
Copyright © 2011-2022 走看看