1. 程式人生 > >利用win api 實現截圖 儲存為BMP並轉為位元組流

利用win api 實現截圖 儲存為BMP並轉為位元組流

c++ 利用winAPI 實現截圖幕;

程式碼:

#include<windows.h>
void ScreenSnap(HBITMAP hBitmap,char *bmpPath,HDC dc);
int main()
{  
 HWND DeskWnd=::GetDesktopWindow();//獲取桌面視窗控制代碼
 RECT DeskRC;
 ::GetClientRect(DeskWnd,&DeskRC);//獲取視窗大小
 HDC DeskDC=GetDC(DeskWnd);//獲取視窗DC
 HBITMAP DeskBmp=::CreateCompatibleBitmap(DeskDC,DeskRC.right,DeskRC.bottom);//相容點陣圖
 HDC memDC=::CreateCompatibleDC(DeskDC);//相容DC
 SelectObject(memDC,DeskBmp);//把相容點陣圖選入相容DC中
 BitBlt(memDC,0,0,DeskRC.right,DeskRC.bottom,DeskDC,0,0,SRCCOPY);//拷貝DC
 ScreenSnap(DeskBmp,"d:\\Screen.bmp",DeskDC);
 return 0;
}
void ScreenSnap(HBITMAP hBitmap,char *bmpPath,HDC dc)
{
BITMAP bmInfo;
DWORD bmDataSize;
char *bmData;//點陣圖資料
GetObject(hBitmap,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(dc,hBitmap,0,bmInfo.bmHeight,bmData,(BITMAPINFO *)&bih,DIB_RGB_COLORS);//獲取點陣圖資料部分
HANDLE hFile=CreateFile(bmpPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
      FILE_ATTRIBUTE_NORMAL,0);//建立檔案
DWORD dwSize;
WriteFile(hFile,(void *)&bfh,sizeof(BITMAPFILEHEADER),&dwSize,0);//寫入點陣圖檔案頭
WriteFile(hFile,(void *)&bih,sizeof(BITMAPINFOHEADER),&dwSize,0);//寫入點陣圖資訊頭
WriteFile(hFile,(void *)bmData,bmDataSize,&dwSize,0);//寫入點陣圖資料
::CloseHandle(hFile);//關閉檔案控制代碼
}

實現某一區域截圖 並轉為位元組流:

int sumSize;
char* getScreen(long left,long top,long right,long bottom){

	HWND DeskWnd=::GetDesktopWindow();//獲取桌面視窗控制代碼
	RECT DeskRC;
	DeskRC.left = left;
	DeskRC.top = top;
	DeskRC.right = right;
	DeskRC.bottom = bottom;

//	::GetClientRect(DeskWnd,&DeskRC);//獲取視窗大小
	HDC DeskDC=GetDC(DeskWnd);//獲取視窗DC
	HBITMAP DeskBmp=::CreateCompatibleBitmap(DeskDC,DeskRC.right-DeskRC.left,DeskRC.bottom-DeskRC.top);//相容點陣圖
	HDC memDC=::CreateCompatibleDC(DeskDC);//相容DC
	SelectObject(memDC,DeskBmp);//把相容點陣圖選入相容DC中
	BitBlt(memDC,0,0,right-DeskRC.left,DeskRC.bottom-DeskRC.top,DeskDC,DeskRC.left,DeskRC.top,SRCCOPY);//拷貝DC

	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);//獲取點陣圖資料部分

    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);

	HANDLE hFile=CreateFile("d:\\Screen.bmp",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
	FILE_ATTRIBUTE_NORMAL,0);//建立檔案
	DWORD dwSize;
	WriteFile(hFile,(void *)stream,sumSize,&dwSize,0);//寫入點陣圖檔案頭
	::CloseHandle(hFile);//關閉檔案控制代碼



	return stream;

}