截屏保存为BMP, 然后转换为jpg, 用GDI和GDI+

 

///
void CRUNMonitorDlg::OnBnClickedBmptojpg()
{
    CString strFilePath = "5.bmp";
    CString strSavePath = "5.jpg";
    CString strEXT = "JPEG";


    Image* pImage = Image::FromFile(strFilePath.AllocSysString());

    if(Ok == pImage->GetLastStatus())
    {
        UINT  nDecCount = 0;  // number of image decoders
        UINT  nDecSize  = 0;  // size of the image decoder array in bytes

        ImageCodecInfo* pImageCodecInfo = NULL;


        GetImageDecodersSize(&nDecCount, &nDecSize);
        pImageCodecInfo = (ImageCodecInfo*) malloc(nDecSize);
        GetImageDecoders(nDecCount, nDecSize, pImageCodecInfo);


        UINT nIndex = 0;


        for(; nIndex < nDecCount; nIndex++)
        {
            if(strEXT == pImageCodecInfo[nIndex].FormatDescription) 
            {
                break;
            }
        }

        Status status = pImage->Save(strSavePath.AllocSysString(), &(pImageCodecInfo[1].Clsid));
        if(Ok != status)
        {
            TRACE2(_T("/nFailed to save image in '%s' file/n")
                _T("GDI+ Error: %u"),
                strFilePath,
                status);
        }
    }
}
///
void CRUNMonitorDlg::OnBnClickedCaptureScreen()
{
    CBitmap bmScreen;
    
    //屏幕DC 
    CDC   *pDesktopDC;

    //获取当前整个屏幕DC 
    pDesktopDC   =   CDC::FromHandle(::GetDC(NULL));
    int   Width   =   pDesktopDC-> GetDeviceCaps(HORZRES); 
    int   Height   =   pDesktopDC-> GetDeviceCaps(VERTRES); 

    bmScreen.CreateCompatibleBitmap(pDesktopDC,   Width,   Height); 

    CDC   memDC;//内存DC 
    memDC.CreateCompatibleDC(pDesktopDC); 
    CBitmap   *oldmemBitmap;//建立和屏幕兼容的bitmap 
    //bmScreen.CreateCompatibleBitmap(pDesktopDC,   Width,   Height); 
    oldmemBitmap   =   memDC.SelectObject(&bmScreen);//将memBitmap选入内存DC 
    memDC.BitBlt(0,   0,   Width,   Height,   pDesktopDC,   0,   0,   SRCCOPY);//复制屏幕图像到内存DC 
    memDC.SelectObject(oldmemBitmap); 

    //以下代码保存memDC中的位图到文件 
    BITMAP   bmp; 
    BITMAPINFOHEADER bihScreen;

    bmScreen.GetBitmap(&bmp);//获得位图信息 
    FILE   *fp   =   fopen("5.bmp",   "w+b"); 
    ZeroMemory(&bihScreen,   sizeof(BITMAPINFOHEADER));//位图信息头 
    bihScreen.biBitCount   =   bmp.bmBitsPixel;//每个像素字节大小 
    bihScreen.biCompression   =   BI_RGB; 
    bihScreen.biHeight   =   bmp.bmHeight;//高度 
    bihScreen.biPlanes   =   1; 
    bihScreen.biSize   =   sizeof(BITMAPINFOHEADER); 
    bihScreen.biSizeImage   =   bmp.bmWidthBytes   *   bmp.bmHeight;//图像数据大小 
    bihScreen.biWidth   =   bmp.bmWidth;//宽度 

    BITMAPFILEHEADER bfhScreen;
    ZeroMemory(&bfhScreen,   sizeof(BITMAPFILEHEADER));//位图文件头 
    bfhScreen.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   sizeof(BITMAPINFOHEADER);//到位图数据的偏移量 
    bfhScreen.bfSize   =   bfhScreen.bfOffBits   +   bmp.bmWidthBytes   *   bmp.bmHeight;//文件总的大小 
    bfhScreen.bfType   =   (WORD)0x4d42; 

    fwrite(&bfhScreen,   1,   sizeof(BITMAPFILEHEADER),   fp);//写入位图文件头 
    fwrite(&bihScreen,   1,   sizeof(BITMAPINFOHEADER),   fp);//写入位图信息头 

    BYTE * pbmScreenData = NULL;
    pbmScreenData   =   new   byte[bmp.bmWidthBytes   *   bmp.bmHeight];//申请内存保存位图数据 
    GetDIBits(memDC.m_hDC,   (HBITMAP)bmScreen.m_hObject,   0,   Height,   pbmScreenData,   
        (LPBITMAPINFO)   &bihScreen,   DIB_RGB_COLORS);//获取位图数据 
    fwrite(pbmScreenData,   1,   bmp.bmWidthBytes   *   bmp.bmHeight,   fp);//写入位图数据 
    delete   []pbmScreenData; 
    pbmScreenData   =   NULL; 
    fclose(fp);
}
///

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值