c++ 抓取桌面屏幕并转为jpg图片

news/2024/11/13 4:29:53/
抓取屏幕代码
char* getScreen(unsigned long &jpg_size){	HWND DeskWnd=::GetDesktopWindow();//获取桌面窗口句柄RECT DeskRC;::GetClientRect(DeskWnd,&DeskRC);//获取窗口大小HDC DeskDC=GetDC(DeskWnd);//获取窗口DCHBITMAP DeskBmp=::CreateCompatibleBitmap(DeskDC,DeskRC.right,DeskRC.bottom);//兼容位图HDC memDC=::CreateCompatibleDC(DeskDC);//兼容DCSelectObject(memDC,DeskBmp);//把兼容位图选入兼容DC中BitBlt(memDC,0,0,DeskRC.right,DeskRC.bottom,DeskDC,0,0,SRCCOPY);BITMAP bmInfo;DWORD bmDataSize;char *bmData;//位图数据GetObject(DeskBmp,sizeof(BITMAP),&bmInfo);//根据位图句柄,获取位图信息bmDataSize=bmInfo.bmWidthBytes*bmInfo.bmHeight;//计算位图数据大小bmData=new char[bmDataSize];//分配数据BITMAPFILEHEADER bfh;//位图文件头bfh.bfType=0x4d42;bfh.bfSize=bmDataSize+54;bfh.bfReserved1=0;bfh.bfReserved2=0;bfh.bfOffBits=54;BITMAPINFOHEADER bih;//位图信息头bih.biSize=40;bih.biWidth=bmInfo.bmWidth;bih.biHeight=bmInfo.bmHeight;bih.biPlanes=1;bih.biBitCount=24;bih.biCompression=BI_RGB;bih.biSizeImage=bmDataSize;bih.biXPelsPerMeter=0;bih.biYPelsPerMeter=0;bih.biClrUsed=0;bih.biClrImportant=0;::GetDIBits(DeskDC,DeskBmp,0,bmInfo.bmHeight,bmData,(BITMAPINFO *)&bih,DIB_RGB_COLORS);//获取位图数据部分ReleaseDC(DeskWnd,DeskDC);DeleteDC(memDC);DeleteObject(DeskBmp);int sumSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmDataSize;char * stream = new char[sumSize];memcpy(stream,&bfh,sizeof(BITMAPFILEHEADER));memcpy(stream+sizeof(BITMAPFILEHEADER),&bih,sizeof(BITMAPINFOHEADER));memcpy(stream+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER),bmData,bmDataSize);delete bmData;bmData=NULL;/*HANDLE hFile=CreateFile(_T("d:\\Screen.bmp"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);//创建文件DWORD dwSize;WriteFile(hFile,(void *)stream,sumSize,&dwSize,0);//写入位图文件头::CloseHandle(hFile);//关闭文件句柄*/;char*p1=rgb_to_jpeg(reinterpret_cast<unsigned char*>(stream),jpg_size,bih.biWidth,bih.biHeight);delete stream;stream=NULL;return p1;}

对应编译好的jpeg.lib库文件下载地址

转为jpg图片代码
char * rgb_to_jpeg(unsigned char *rgb,unsigned long &jpg_size,int biWidth,int bmHeight)
{   struct jpeg_compress_struct jcs;struct jpeg_error_mgr jem;JSAMPROW row_pointer[1];int row_stride=0;unsigned char *jpg_buf=NULL;jcs.err = jpeg_std_error(&jem);jpeg_create_compress(&jcs);//printf("jpeg_mem_dest\n");jpeg_mem_dest(&jcs,&jpg_buf,&jpg_size);jcs.image_width =biWidth;  jcs.image_height =bmHeight;jcs.input_components = 3;//1;  jcs.in_color_space = JCS_RGB;//JCS_GRAYSCALE;  jpeg_set_defaults(&jcs);  jpeg_set_quality(&jcs,30,TRUE);jpeg_start_compress(&jcs, TRUE);row_stride =jcs.image_width * 3;while(jcs.next_scanline < jcs.image_height){//对每一行进行压缩  row_pointer[0] = &rgb[(jcs.image_height-jcs.next_scanline-1) * row_stride];(void)jpeg_write_scanlines(&jcs,row_pointer, 1);}   jpeg_finish_compress(&jcs);jpeg_destroy_compress(&jcs);/*printf("jpg_size = %lu\n",jpg_size);FILE *p;p= fopen("d:\\04.jpg","wb");if(p==NULL)printf("error in fopen\n");fwrite(jpg_buf,1,jpg_size,p);fclose(p);*/return reinterpret_cast<char*>(jpg_buf);
}

可以关注以下公众号交流:
在这里插入图片描述


http://www.ppmy.cn/news/506122.html

相关文章

利用Windows自带gdi32.dll实现抓取屏幕

internal static void GetScreenShot( ) { //获得当前屏幕的大小 Rectangle rect new Rectangle(); rect Screen.AllScreens[0].WorkingArea; //计算图片的大小&#xff0c;因为图片的长和宽有可能超过目前屏幕的大小 //创建一个以当前屏幕为模板的图象 Control ctl new …

android实时抓取屏幕文字,Android录制屏幕的实现方法

原文:Paul Kinlan 翻译:Agora.io 长久以来,我一直希望能够直接从Android屏幕上进行录制并将其编码为多种格式,以便将录制内容嵌入在任意位置,而不需要安装任何软件。 如今,我们已经接近这个目标。Chrome团队正在添加一种功能,可以通过getUserMedia从Android设备上共享屏…

java获取屏幕截图

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; java教程全解 java获取屏幕截图 测试代码 public static void main(String[] args) {//文件与BufferedImage间的转换BufferedImage biigetScreen();img2file(bii,"jpg","test1.jpg"); …

捕获计算机屏幕++方法,在Win10中获取屏幕截图的五大方法

如果您是Win10的新手,或者甚至是专业人士在Win10中截取屏幕截图与其他操作系统相比有些困难。屏幕截图在某些情况下可以节省您的时间。此外,如果您指定截屏的所有不同方式,尤其是在Win10中,您绝对可以节省更多时间。请注意,所有这些截图都只适用于Win10,它可能适用于其他…

C++ 屏幕抓取代码及解析

代码 // An highlighted block void GetScreenShot(void) {BITMAPFILEHEADER bfHeader;BITMAPINFOHEADER biHeader;BITMAPINFO bInfo;HGDIOBJ hTempBitmap;HBITMAP hBitmap;BITMAP bAllDesktops;HDC hDC, hMemDC;LONG lWidth, lHeight;BYTE *bBits NULL;HANDLE hHeap GetPro…

C#实现捕获当前屏幕截图(转)

C#实现捕获当前屏幕截图(转) 编程思路&#xff08;API 编程&#xff09;&#xff1a;先调用 GetForegroundWindow 获取当前活动程序窗口句柄&#xff0c;然后调用 GetWindowDC 获取窗口的设备句柄&#xff08;或 GetDC 函数&#xff09;&#xff0c;调用 BitBlt 位图传输函数将…

python如何屏幕截图_Python实现屏幕截图的两种方式

使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释。 一、Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 不跨平台 import time import win32gui, win32ui, win32con, win32api def window_capture(filename): hwnd = …

c语言程序图片截取,C++实现屏幕截图功能

本文实例为大家分享了C++实现全屏截图功能的具体代码,供大家参考,具体内容如下 最近维护的项目,在某些情况下,光有日志还不行,于是添加了截图功能,特定情况下,会自动截图,辅助分析,从而改进程序。以下是截图实现代码。 void CDemoDlg::ScreenShot(void) {CWnd *pDeskt…