抓取屏幕代碼
char* getScreen(unsigned long &jpg_size){
HWND DeskWnd=::GetDesktopWindow();
RECT DeskRC;
::GetClientRect(DeskWnd,&DeskRC);
HDC DeskDC=GetDC(DeskWnd);
HBITMAP DeskBmp=::CreateCompatibleBitmap(DeskDC,DeskRC.right,DeskRC.bottom);
HDC memDC=::CreateCompatibleDC(DeskDC);
SelectObject(memDC,DeskBmp);
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;
;
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);
jpeg_mem_dest(&jcs,&jpg_buf,&jpg_size);
jcs.image_width =biWidth;
jcs.image_height =bmHeight;
jcs.input_components = 3;
jcs.in_color_space = JCS_RGB;
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);
return reinterpret_cast<char*>(jpg_buf);
}