现在的位置: 首页 > 综合 > 正文

MFT 抓图2 bmp图片,黑白

2012年10月22日 ⁄ 综合 ⁄ 共 4315字 ⁄ 字号 评论关闭
HBITMAP CopyScreenToBitmap( LPRECT lpRect,int m_xScreen,int m_yScreen)
{
    HDC hScrDC,hMemDC;
    HBITMAP hBitmap,hOldBitmap;
    int nX1,nX2,nY1,nY2;
    int nWidth,nHeight;
    if (IsRectEmpty(lpRect))
    {
        return FALSE;
    }
    //为屏幕创建设备描述表
    hScrDC = CreateDC("DISPLAY",NULL,NULL,NULL);
    //为屏幕设备描述表创建兼容的内存设备描述表
    hMemDC = CreateCompatibleDC(hScrDC);
    // 获得选定区域坐标
    nX1 = lpRect->left;
    nY1 = lpRect->top;
    nX2 = lpRect->right;
    nY2 = lpRect->bottom;
    //确保选定区域是可见的
    if (nX1 < 0)
        nX1 = 0;
    if (nY1 < 0)
        nY1 = 0;
    if (nX2 > m_xScreen)
        nX2 = m_xScreen;
    if (nY2 > m_yScreen)
        nY2 = m_yScreen;
    nWidth = nX2 - nX1;
    nHeight = nY2 - nY1;
    // 创建一个与屏幕设备描述表兼容的位图
    hBitmap = CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
    // 把新位图选到内存设备描述表中
    hOldBitmap = (HBITMAP)SelectObject(hMemDC,hBitmap);
    // 把屏幕设备描述表拷贝到内存设备描述表中
    BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX1,nY1,SRCCOPY);
    //得到屏幕位图的句柄
    hBitmap = (HBITMAP)SelectObject(hMemDC,hOldBitmap);
    //清除
    DeleteDC(hScrDC);
    DeleteDC(hMemDC);
    return hBitmap;
}

BOOL SaveBitmapToFile(HBITMAP hBitmap, char * lpFileName)
{
    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(lpFileName,   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;

}

 

void CMainFrame::OnZt()
{
    // TODO: 在此添加命令处理程序代码

    HBITMAP g_screenBmp=NULL;
    //获取x方向屏幕像素()
    int m_xScreen = GetSystemMetrics(SM_CXSCREEN);
    //获取y方向屏幕像素()
    int m_yScreen = GetSystemMetrics(SM_CYSCREEN);
    RECT g_qq_DlgRt;
    g_qq_DlgRt.left = 0;
    g_qq_DlgRt.top = 0;
    g_qq_DlgRt.right = m_xScreen;
    g_qq_DlgRt.bottom = m_yScreen;
    g_screenBmp = CopyScreenToBitmap(&g_qq_DlgRt,m_xScreen,m_yScreen);
    CString strTime = CTime::GetCurrentTime().Format("%Y%m%d%H%M%S");
    CString str="c:\\"+strTime+".bmp";
    LPSTR fileName=str.GetBuffer();
    SaveBitmapToFile(g_screenBmp,fileName);

 

抱歉!评论已关闭.