• VC将屏幕区域保存为图片[转]


    VC将屏幕区域保存为图片,该代码为网上搜集整理。

      1 int   CDlldemoDlg::SaveBitmapToFile(HBITMAP   hBitmap,   LPSTR   lpFileName)   //hBitmap   为刚才的屏幕位图句柄   
      2 {           //lpFileName   为位图文件名   
      3     WORD   wBitCount;   //位图中每个像素所占字节数     
      4     
      5     //定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数     
      6     DWORD   dwPaletteSize=0,dwBmBitsSize,dwDIBSize,   dwWritten;     
      7     BITMAP   Bitmap; //位图属性结构     
      8     BITMAPFILEHEADER   bmfHdr;   //位图文件头结构     
      9     BITMAPINFOHEADER   bi;   //位图信息头结构     
     10     HANDLE   fh;   //定义文件,分配内存句柄,调色板句柄   
     11     LPSTR   lpbk,lpmem;   
     12     
     13     wBitCount   =   32;     
     14     //设置位图信息头结构     
     15     GetObject(hBitmap,   sizeof(BITMAP),   (LPSTR)&Bitmap);     
     16     bi.biSize   =   sizeof(BITMAPINFOHEADER);     
     17     bi.biWidth   =   Bitmap.bmWidth;     
     18     bi.biHeight   =   Bitmap.bmHeight; //为负,正向的位图;为正,倒向的位图   
     19     bi.biPlanes   =   1;     
     20     bi.biBitCount   =   wBitCount;     
     21     bi.biCompression   =   BI_RGB;     
     22     bi.biSizeImage=0;     
     23     bi.biXPelsPerMeter=0;     
     24     bi.biYPelsPerMeter=0;     
     25     bi.biClrUsed=0;     
     26     bi.biClrImportant=0;     
     27     dwBmBitsSize=((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;     
     28     
     29     //创建位图文件     
     30     fh   =   CreateFile(lpFileName,   GENERIC_WRITE,   0,   NULL,   CREATE_ALWAYS,     
     31         FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_SEQUENTIAL_SCAN,   NULL);     
     32     if   (fh   ==   INVALID_HANDLE_VALUE)     
     33         return   FALSE;     
     34     //设置位图文件头     
     35     bmfHdr.bfType   =   0x4D42;   //   "BM"     
     36     dwDIBSize   =   sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwBmBitsSize;     
     37     bmfHdr.bfSize   =   dwDIBSize;     
     38     bmfHdr.bfReserved1   =   0;     
     39     bmfHdr.bfReserved2   =   0;     
     40     bmfHdr.bfOffBits   =   (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER);   
     41     
     42     //写入位图文件头     
     43     WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),&dwWritten,   NULL);     
     44     //写入位图信息头   
     45     WriteFile(fh,   (LPSTR)&bi,sizeof(BITMAPINFOHEADER),&dwWritten,   NULL);   
     46     
     47     //获取位图阵列   
     48     lpmem=new   char[dwBmBitsSize];   
     49     lpbk=(LPSTR)   new   char[dwBmBitsSize];   
     50     GetBitmapBits(hBitmap,dwBmBitsSize,lpmem);//正向的内存图象数据   
     51     
     52     //转化为倒向数据(仅在bmHeight为正时需要)   
     53     for(int   i=0;i<Bitmap.bmHeight;i++)   
     54     {   
     55         memcpy(lpbk+Bitmap.bmWidth*i*4,lpmem+Bitmap.bmWidth*(Bitmap.bmHeight-i-1)*4,Bitmap.bmWidth*4);   
     56     }   
     57     //写位图数据   
     58     WriteFile(fh,   lpbk,dwBmBitsSize,&dwWritten,   NULL);   
     59     
     60     //清除     
     61     delete   []lpbk;   
     62     delete   []lpmem;   
     63     
     64     CloseHandle(fh);   
     65     return   TRUE;   
     66     
     67 }
     68 HBITMAP   CDlldemoDlg::CopyScreenToBitmap(LPRECT   lpRect)   //lpRect   代表选定区域   
     69 {   
     70     HDC   hScrDC,hMemDC; //屏幕和内存设备描述表   
     71     HBITMAP   hBitmap,hOldBitmap;//位图句柄   
     72     int   nX,nY,nX2,nY2; //选定区域坐标   
     73     int   nWidth,nHeight; //位图宽度和高度   
     74     int   xScrn,yScrn; //屏幕宽度和高度   
     75     
     76     //确保选定区域不为空矩形   
     77     if(IsRectEmpty(lpRect))     
     78         return   NULL;     
     79     
     80     //为屏幕创建设备描述表   
     81     hScrDC=CreateDC("DISPLAY",   NULL,   NULL,   NULL);   
     82     //为屏幕设备描述表创建兼容的内存设备描述表   
     83     hMemDC=CreateCompatibleDC(hScrDC);   //或者::CreateCompatibleDC(NULL)   
     84     
     85     //获得选定区域坐标     
     86     nX=lpRect->left;   
     87     nY=lpRect->top;   
     88     nX2=lpRect->right;   
     89     nY2=lpRect->bottom;     
     90     
     91     //获得屏幕宽度和高度   
     92     xScrn=GetDeviceCaps(hScrDC,HORZRES);   
     93     yScrn=GetDeviceCaps(hScrDC,VERTRES);     
     94     
     95     //确保选定区域是可见的   
     96     if   (nX<0)   
     97         nX=0;   
     98     if   (nY<0)   
     99         nY=0;   
    100     if   (nX2>xScrn)   
    101         nX2=xScrn;     
    102     if   (nY2>yScrn)   
    103         nY2=yScrn;     
    104     
    105     nWidth=nX2-nX;     
    106     nHeight=nY2-nY;   
    107     
    108     //创建一个与屏幕设备描述表兼容的位图     
    109     hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);     
    110     
    111     //把新位图选到内存设备描述表中     
    112     hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);   
    113     
    114     //把屏幕设备描述表拷贝到内存设备描述表中   
    115     BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY);   
    116     
    117     //得到屏幕位图的句柄   
    118     hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);   
    119     
    120     //清除   
    121     DeleteDC(hScrDC);   
    122     DeleteDC(hMemDC);   
    123     return   hBitmap;   //返回位图句柄  
    124 }   
  • 相关阅读:
    html基础
    jenkins+ant+git+android搭建笔记
    appiumforandroid从零安装笔记(forWindows)
    使用enterTextInWebElement处理qq授权页报“网络异常,请稍后再试”的解决方法
    自动化日志测试计划
    robotium4.2简化通过id操作view啦
    在windows平台捕获iOS设备控制台日志
    android抓包笔记
    [Leetcode] Move Zeros
    [8.3] Magic Index
  • 原文地址:https://www.cnblogs.com/zhouwenJS/p/3763100.html
Copyright © 2020-2023  润新知