如何截取屏幕图片并把它在内存中转化成jpg

来源:互联网 发布:遗传算法应用生活实例 编辑:程序博客网 时间:2024/05/17 11:58

// 截取屏幕图片
CDC dc ;
dc .CreateDC ("DISPLAY",NULL ,NULL ,NULL );     // 创建设备描述表

CBitmap bm ;
int Width   = GetSystemMetrics (SM_CXSCREEN );// 得到屏幕的宽
int Height = GetSystemMetrics (SM_CYSCREEN );// 得到屏幕的高  
bm .CreateCompatibleBitmap (&dc ,Width ,Height );// 创建与屏幕设备描述表兼容位图

CDC tdc ;
// 与设备描述表兼容的内存设备描述表
tdc .CreateCompatibleDC (&dc );
CBitmap *pOld = tdc .SelectObject (&bm );

// 设备描述表拷贝到内存设备描述表中
tdc .BitBlt (0,0,Width ,Height ,&dc ,0,0,SRCCOPY );
tdc .SelectObject (pOld );
bm .GetBitmap (&btm );

// 压缩转化成jpg 格式
HBITMAP m_hBmp = (HBITMAP )bm .GetSafeHandle ();
CImage   m_image ;
m_image .Attach (m_hBmp );   // 绑定到m_hBmp
IStream * pStmImage   = NULL ;
HGLOBAL   hMemBmp = GlobalAlloc (GMEM_MOVEABLE ,0);// 分配一块默认堆,返回一块内存对象句柄
if (hMemBmp == NULL )
    return ;

CreateStreamOnHGlobal (hMemBmp , FALSE , &pStmImage ); // 将内存区作为流的起始
if (pStmImage == NULL )
{
    GlobalFree (hMemBmp );
    AfxMessageBox ( " 为空 ");
    return ;
}

m_image .Save (pStmImage ,Gdiplus ::ImageFormatJPEG );// 以jpg格式保存
BYTE * pbyBmp = (BYTE *)GlobalLock (hMemBmp );// 把一个内存对象句柄转化成一个指针
int   msize = GlobalSize (hMemBmp );
BYTE * bdata = new BYTE [msize ];  // 申请数据空间
memcpy (bdata ,pbyBmp ,msize );  // 得到文件的数据
// 这时就可以把bdata中的数据保存到文件中了

// 释放空间
if ( bdata != NULL )
{   
    delete []bdata ;
    bdata = NULL ;
}

// 释放流
if (pStmImage != NULL )
{
    pStmImage -> Release ();
    pStmImage = NULL ;
}

// 释放堆空间
if (hMemBmp != NULL )
{
    GlobalUnlock (hMemBmp );
    GlobalFree (hMemBmp );
    hMemBmp = NULL ;
}

if (m_image )
{
    m_image .Detach ();
    m_image .Destroy ();
}

::DeleteObject (m_hBmp ); 

 

 

原创粉丝点击