日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2024/1/1 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 抓取桌面屏幕并转为jpg图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
抓取屏幕代碼
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); }

可以關注以下公眾號交流:

總結

以上是生活随笔為你收集整理的c++ 抓取桌面屏幕并转为jpg图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。