有人做过滚屏截图吗
我想问下是怎么做到的?就是原理性的东西
[解决办法]
在Windows操作系统下,做过滚屏和截图,我是这样弄的:
滚屏: 通过Bitblt等Windows的绘图API函数,不断修改绘制坐标来实现。
截图:先通过API获取屏幕HDC,将屏幕HDC内容先写到内存,然后按照BMP等文件格式,
将BMP头,图像数据等等全部写入文件。
[解决办法]
什么是滚屏截图?翻页?每翻一页截图一次?
截图的程序我有
int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName)
{
HDC hDC; //éè±??èê?±í
int iBits;//μ±?°??ê?·?±??ê???????????ù??×??úêy
WORD wBitCount;//??í??D?????????ù??×??úêy
DWORD dwPaletteSize=0;//?¨ò?μ÷é?°?′óD?
DWORD dwBmBitsSize;//??í??D????×??ú′óD?
DWORD dwDIBSize;// ??í????t′óD?
DWORD dwWritten;//D′è????t×??úêy
BITMAP Bitmap;//??í??á11
BITMAPFILEHEADER bmfHdr; //??í?ê?D??á11
BITMAPINFOHEADER bi; //??í????tí·?á11
LPBITMAPINFOHEADER lpbi; //??í?D??¢í·?á11 ???ò??í?D??¢í·?á11
HANDLE fh;//?¨ò????t??±ú
HANDLE hDib;//·????ú′???±ú
HANDLE hPal;//·????ú′???±ú
HANDLE hOldPal=NULL;//μ÷é?°???±ú
//??????í????t?????????ù??×??úêy
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else if (iBits<=32)
wBitCount = 24;
//????μ÷é?°?′óD?
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);
//éè????í?D??¢í·?á11
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4*Bitmap.bmHeight ;
//?a??í??úèY·????ú′?
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
if (lpbi==NULL)
{
return 0;
}
*lpbi = bi;
// ′|àíμ÷é?°?
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// ??è???μ÷é?°???D?μ??????μ
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);
//???′μ÷é?°?
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}
//′′?¨??í????t
fh = CreateFile(lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL
[解决办法]
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
// éè????í????tí·
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;
// D′è???í????tí·
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// D′è???í????t??óà?úèY
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//??3y
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return 1;
}
HBITMAP GetCaptureBmp()
{
HDC hDC;
HDC MemDC;
BYTE* Data;
HBITMAP hBmp;
BITMAPINFO bi;
memset(&bi, 0, sizeof(bi));
bi.bmiHeader.biSize = sizeof(BITMAPINFO);
bi.bmiHeader.biWidth = GetSystemMetrics(SM_CXSCREEN);
bi.bmiHeader.biHeight = GetSystemMetrics(SM_CYSCREEN);
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
hDC = GetDC(NULL);
MemDC = CreateCompatibleDC(hDC);
hBmp = CreateDIBSection(MemDC, &bi, DIB_RGB_COLORS, (void**)&Data, NULL, 0);
SelectObject(MemDC, hBmp);
BitBlt(MemDC, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight,hDC, 0, 0, SRCCOPY);
ReleaseDC(NULL, hDC);
DeleteDC(MemDC);
return hBmp;
}