MFC 屏幕截图(libjpeg bmp转jpg)

项目中需要用到的功能。

void Screenshot()
{
    CDC *pDC;
    pDC = CDC::FromHandle(GetDC(GetDesktopWindow()));
    if(pDC == NULL)
        return;
    int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);
    int Width = pDC->GetDeviceCaps(HORZRES);
    int Height = pDC->GetDeviceCaps(VERTRES);

    CDC memDC;
    if(memDC.CreateCompatibleDC(pDC) == 0)
        return;

    CBitmap memBitmap, *oldmemBitmap;
    if(memBitmap.CreateCompatibleBitmap(pDC, Width, Height) == NULL)
        return;

    oldmemBitmap = memDC.SelectObject(&memBitmap);
    if(oldmemBitmap == NULL)
        return;
    if(memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY) == 0)
        return;

    CPoint po;
    GetCursorPos(&po);
    HICON hinco = (HICON)GetCursor();
    memDC.DrawIcon(po.x-10 , po.y - 10 , hinco);

    BITMAP bmp;
    memBitmap.GetBitmap(&bmp);

    BITMAPINFOHEADER bih = {0};
    bih.biBitCount = bmp.bmBitsPixel;
    bih.biCompression = BI_RGB;
    bih.biHeight = bmp.bmHeight;
    bih.biPlanes = 1;
    bih.biSize = sizeof(BITMAPINFOHEADER);
    bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;
    bih.biWidth = bmp.bmWidth;

    BITMAPFILEHEADER bfh = {0};
    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;
    bfh.bfType = (WORD)0x4d42;

    BYTE* pImgBuff = new BYTE[bmp.bmWidthBytes * bmp.bmHeight];

    GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject
        , 0, Height, pImgBuff, (LPBITMAPINFO) &bih, DIB_RGB_COLORS);
    memDC.SelectObject(oldmemBitmap);

    BYTE* pJpg = NULL;
    int nJpgSize = BmpToJpeg(pImgBuff, bmp.bmWidth, bmp.bmHeight, &pJpg);

    if (NULL != pJpg)
    {
        delete[] pJpg;
    }

    delete [] pImgBuff;
}

附上 BmpToJpeg

int BmpToJpeg(BYTE *pSrc, int nWidth, int nHeight, BYTE** ppDes)
{
    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr jerr;
    JSAMPROW row_pointer[1];
    int row_stride;
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);

    DWORD dwLen = nWidth * nHeight * 3;
    jpeg_mem_dest(&cinfo, ppDes, &dwLen);

    cinfo.image_width = nWidth;
    cinfo.image_height = nHeight;
    cinfo.input_components = 3;
    cinfo.in_color_space = JCS_RGB;

    jpeg_set_defaults(&cinfo);
    jpeg_set_quality(&cinfo, JPEG_QUALITY, TRUE);
    jpeg_start_compress(&cinfo, TRUE);

    row_stride = nWidth * 3;
    for (int i=0, j=0; j < nWidth*nHeight*4; i+=3, j+=4)    //BGRA => RGB
    {
        *(pSrc+i)=*(pSrc+j+2);
        *(pSrc+i+1)=*(pSrc+j+1);
        *(pSrc+i+2)=*(pSrc+j);
    }

    while (cinfo.next_scanline < cinfo.image_height)
    {
        row_pointer[0] = &pSrc[(cinfo.image_height - cinfo.next_scanline - 1) * row_stride];
        (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
    }
    jpeg_finish_compress(&cinfo);

    jpeg_destroy_compress(&cinfo);
    return dwLen;
}

需要用到的头文件

#define JPEG_QUALITY 50
extern "C"
{
#include "jpeglib.h"
#include "jmorecfg.h"
#include "jconfig.h"
}
时间: 2024-10-28 04:53:46

MFC 屏幕截图(libjpeg bmp转jpg)的相关文章

远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像

远程控制编写之屏幕传输  MFC实现  屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_xiehonghao/article/details/37656281 二: 被控端的代码 注意下面代码要放到一个线程中去 因为用到了while死循环 表示一直发送消息  直到对方关闭接收,发送失败后自动退出! 一定要放进线程 DWORD __stdcall SendScreen(LPVOID lpa

MFC对话框显示BMP图片

1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest. 对话框类为CTestDlg (一)    非动态载入图片. 方法1.先从最简单的开始,用picture 控件来实现. 步骤: 先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对话框上添加一个picture控件,右键点

MFC中显示 .bmp格式的位图

最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图. 首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进行重新绘制. 一般而言,对于单文档或多文档的MFC程序,显示图像的代码要放在OnDraw函数之中.刚刚说过,窗口重绘时,要先将窗口的背景擦除,也就是发送WM_ERASEBKGND消息,然后用OnEraseBkgnd()函数处理这个消息,所以我们的显示图像的代码也可以放在这个函数之中.当然,这里只是为

[00011]-[2015-08-26]-[00]-[Windows 程序设计 ---MFC 截屏---&gt;BMP格式 ---&gt;JPG格式]

HBITMAP CopyScreenToBitmap(LPRECT lpRect){ HDC hScrDC, hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 位图宽度和高度 int xScrn, yScrn; // 屏幕分辨率 if (IsRectEmpty(lpRect)) return NULL; hScrDC

MFC CListCtrl 显示bmp图片

m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle()| LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES); m_ListCtrl.InsertColumn(0, L"#", LVCFMT_CENTER, 0); m_ListCtrl.InsertColumn(1,_T("T1"),LVCFMT_LEFT,100); m_ListCtrl.InsertColumn(2,_T(

MFC如何添加bmp文件和ICO文件

1.添加BMP格式文件如下图所示: 2.添加ICO格式文件如下图所示: 原文地址:https://www.cnblogs.com/lize19940412/p/10129123.html

MFC 屏幕截图方法

//获取当前屏幕的并且保存图片 LRESULT CFeetScanView::SaveViewBMP(WPARAM wParam, LPARAM lParam) { CRect rect; this->GetClientRect(&rect); rect.left = 20; rect.top = 80; CBitmap m_bitmap; m_bitmap.m_hObject = CopyScreenToBitmap(rect); char szFileName[_MAX_PATH]; c

基于MFC的含四则混合运算的计算器

今天无意间发现win7系统的标准型计算器连最基本的四则混合运算都没做,刚刚好公司给了我一个工作任务,就是用MFC实现一个含四则混合运算的计算器. 我在网上查询资料,发现大部分只是实现了基本的加减乘除运算,而含四则混合运算的也没有能够说得清楚明白.于是我搜索四则混合运算算法,发现要实现四则混合运算,就要用到逆波兰算法,而使用逆波兰算法,就要先把算术式从中缀表达式转换为后缀表达式. 所谓中缀表达式,就是我们平常的算术式,例如:1+2-3*4/5. 而后缀表达式,就是将运算符写在操作数之后,上面算术式

CSDN回帖得分大全(近两年)

CSDN回帖得分大全(近两年) √ vs2005调用dll的时候Initialize()函数返回错误[VC/MFC 基础类] √ 为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作![VC/MFC 界面] √ CFileFind::FindFile   支持通配符么?[VC/MFC 基础类] √ vc++   浮动窗口联动的实现[VC/MFC 界面] √ VC   从数据库中读出数据流后怎么判断文件格式[VC/MFC 数据库] √ windows   7接硬體,不會自動刷新   請