有人做过滚屏截图吗解决方案
有人做过滚屏截图吗
我想问下是怎么做到的?就是原理性的东西
------解决方案--------------------
在Windows操作系统下,做过滚屏和截图,我是这样弄的:
滚屏: 通过Bitblt等Windows的绘图API函数,不断修改绘制坐标来实现。
截图:先通过API获取屏幕HDC,将屏幕HDC内容先写到内存,然后按照BMP等文件格式,
将BMP头,图像数据等等全部写入文件。
------解决方案--------------------
什么是滚屏截图?翻页?每翻一页截图一次?
截图的程序我有
我想问下是怎么做到的?就是原理性的东西
------解决方案--------------------
在Windows操作系统下,做过滚屏和截图,我是这样弄的:
滚屏: 通过Bitblt等Windows的绘图API函数,不断修改绘制坐标来实现。
截图:先通过API获取屏幕HDC,将屏幕HDC内容先写到内存,然后按照BMP等文件格式,
将BMP头,图像数据等等全部写入文件。
------解决方案--------------------
什么是滚屏截图?翻页?每翻一页截图一次?
截图的程序我有
- C/C++ code
int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName) { HDC hDC; //É豸ÃèÊö±í int iBits;//µ±Ç°ÏÔʾ·Ö±æÂÊÏÂÿ¸öÏñËØËùÕ¼×Ö½ÚÊý WORD wBitCount;//λͼÖÐÿ¸öÏñËØËùÕ¼×Ö½ÚÊý DWORD dwPaletteSize=0;//¶¨Òåµ÷É«°å´óС DWORD dwBmBitsSize;//λͼÖÐÏñËØ×Ö½Ú´óС DWORD dwDIBSize;// λͼÎļþ´óС DWORD dwWritten;//дÈëÎļþ×Ö½ÚÊý BITMAP Bitmap;//λͼ½á¹¹ BITMAPFILEHEADER bmfHdr; //λͼÊôÐԽṹ BITMAPINFOHEADER bi; //λͼÎļþÍ·½á¹¹ LPBITMAPINFOHEADER lpbi; //λͼÐÅϢͷ½á¹¹ Ö¸ÏòλͼÐÅϢͷ½á¹¹ HANDLE fh;//¶¨ÒåÎļþ¾ä±ú HANDLE hDib;//·ÖÅäÄÚ´æ¾ä±ú HANDLE hPal;//·ÖÅäÄÚ´æ¾ä±ú HANDLE hOldPal=NULL;//µ÷É«°å¾ä±ú //¼ÆËãλͼÎļþÿ¸öÏñËØËùÕ¼×Ö½ÚÊý 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; //¼ÆËãµ÷É«°å´óС if (wBitCount <= 8) dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD); //ÉèÖÃλͼÐÅϢͷ½á¹¹ 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 ; //ΪλͼÄÚÈÝ·ÖÅäÄÚ´æ 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); } // »ñÈ¡¸Ãµ÷É«°åÏÂеÄÏñËØÖµ 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); } //´´½¨Î»Í¼Îļþ fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // ÉèÖÃλͼÎļþÍ· 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; // дÈëλͼÎļþÍ· WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // дÈëλͼÎļþÆäÓàÄÚÈÝ WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //Çå³ý 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; }