如何截取屏幕图片并把它在内存中转化成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 );
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 );
相关文章推荐
- 如何将jpg等格式的图片转化为yuv
- 如何用C#将tif格式的图片转化成jpg?
- iOS 如何截取超出屏幕区域的图片
- 如何截取屏幕图片
- 如何使用glide在加载成功图片时,截取屏幕
- linux下多张jpg图片转化为.avi
- 现有一张bmp图片,VC中如何截取图片的指定的一部分并保存
- 如何实现仿百度文库和截取PDF文档图片
- css如何使body背景图片适合所有大小宽度的屏幕
- 如何将jpg转换成pdf图片格式
- 关于缩小图片时inputStream流转换问题-如何在处理完图片后转化为inputStream流
- 如何获取手机内存视频(图片)略缩图
- C#——主进程负责向屏幕不间断输出四位随机数,子线程负责每隔 1 秒钟对当前计算机屏幕进行截屏并以 jpg 格式的图片保存文件。
- 截取屏幕图片
- 如何在MFC窗口显示BMP和JPG图片
- 如何让图片自适应手机等移动设备屏幕大小
- 如何将.jpg图片 转换成.eps 格式图片
- Webdriver中实现区域截图的方式以及如何截取frame中的图片
- 截取控件和屏幕图片并保存
- C/C++:如何在程序中加载JPG图片?