win apiによるスクリーンショットのBMP保存とバイトストリームへの移行
3771 ワード
c++はwinAPIを利用してスクリーンを切断する.
コード:
領域のスクリーンショットを実現し、バイトストリームに変換します.
コード:
#include
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;
}