您的位置:首页 > 其它

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

2009-07-02 09:42 323 查看
// 截取屏幕图片

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 );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: