啊截图数据不能保存啊
求救啊,截图数据不能保存啊!!!!!!!!!!!!!!
求救啊,这是我写的一个屏幕截图保存函数,(截图后的位图句柄有m_hBitmapbaoc),可是截图后每次执行到GetDIBits这个函数就有捕捉到自己抛出的异常(即函数执行==0)啊,怎么办啊,老是卡在那过不去啊
------解决方案--------------------
- C/C++ code
void CDib::SaveBitmapToFile(CString& strPath) //m_hBitmap是一个位图句柄 { //计算位图文件没像素所占位数 HDC hDC=CreateDC("DISPLAY",NULL,NULL,NULL); DWORD iBits=GetDeviceCaps(hDC,BITSPIXEL); DeleteDC(hDC); DWORD wBitCount=0; DWORD dwPaletteSize=0; if(iBits<=1) wBitCount=1; else if(iBits<=4) wBitCount=4; else if(iBits<=8) wBitCount=8; else wBitCount=24; //24或者32位 //计算调色板大小 DWORD nColorTableEntries=0; //调色板项数 if(wBitCount<=8) //》8是没有调色板,真彩色 nColorTableEntries=(1<<wBitCount); dwPaletteSize=nColorTableEntries*sizeof(RGBQUAD); //设置位图信息头结构 BITMAP bmp; if(!GetObject(m_hBitmap,sizeof(BITMAP),&bmp)) return; //从位图句柄得到位图信息 DWORD dwBmBitsSize=(bmp.bmWidth*wBitCount+31)/32*4*bmp.bmHeight; //实际存储的位图数据大小 //设置位图信息头结构 BITMAPINFOHEADER bi; bi.biSize=sizeof(BITMAPINFOHEADER); bi.biWidth=bmp.bmWidth; bi.biHeight=bmp.bmHeight; bi.biPlanes=1; bi.biBitCount=wBitCount; bi.biSizeImage=dwBmBitsSize; bi.biXPelsPerMeter=0; bi.biYPelsPerMeter=0; bi.biClrUsed=nColorTableEntries; bi.biClrImportant=nColorTableEntries; //为位图分配内存(分配" 信息头+调色板+数据"内存) HANDLE hDib=GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize); LPBITMAPINFOHEADER pbmfHdr=(LPBITMAPINFOHEADER)GlobalLock(hDib); if(pbmfHdr==NULL) { AfxMessageBox("内存分配失败!"); GlobalUnlock(hDib); GlobalFree(hDib); return; } //处理调色板 HPALETTE hPal,hOldPal; HANDLE hFile; hPal=(HPALETTE)GetStockObject(DEFAULT_PALETTE); if(hPal) { hDC=::GetDC(NULL); //获取设备上下文 hOldPal=(HPALETTE)::SelectPalette(hDC,hPal,FALSE); //选入调色板,并保存旧的调色板 RealizePalette(hDC); //实现调色板 } try { [color=#FF0000] if(GetDIBits(hDC,m_hBitmap,0,(UINT)bmp.bmHeight,(LPSTR)pbmfHdr+sizeof(BITMAPINFOHEADER)+dwPaletteSize, (LPBITMAPINFO)(pbmfHdr),DIB_RGB_COLORS)==0)[/color]//得到位图数据 { throw new CException; } BITMAPFILEHEADER bmfHdr; //构建文件头 bmfHdr.bfType=0x4d42; //'BM' bmfHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize; //位图数据偏移 bmfHdr.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) //位图文件大小 +dwPaletteSize +dwBmBitsSize; bmfHdr.bfReserved1=bmfHdr.bfReserved2=0; //创建位图文件 hFile=::CreateFile(strPath,GENERIC_WRITE,FILE_SHARE_READ,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile==INVALID_HANDLE_VALUE) { throw new CException; } DWORD dwNum; ::WriteFile(hFile,(LPCSTR)&bmfHdr,sizeof(BITMAPFILEHEADER),&dwNum,NULL); //写入文件头 ::WriteFile(hFile,lpbi,sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize,&dwNum,NULL);//写入信息头+调色板+位图数据 } catch(CException* pe) { AfxMessageBox("文件保存失败!"); pe->Delete(); SelectPalette(hDC,hOldPal,TRUE);//还原调色板 ::ReleaseDC(NULL,hDC); GlobalUnlock(hDib); //释放内存 GlobalFree(hDib); return; } SelectPalette(hDC,hOldPal,TRUE);//还原调色板 ::ReleaseDC(NULL,hDC); GlobalUnlock(hDib);//释放内存 GlobalFree(hDib); }
求救啊,这是我写的一个屏幕截图保存函数,(截图后的位图句柄有m_hBitmapbaoc),可是截图后每次执行到GetDIBits这个函数就有捕捉到自己抛出的异常(即函数执行==0)啊,怎么办啊,老是卡在那过不去啊
------解决方案--------------------
- C/C++ code
BOOL DibSaveImage (PTSTR pstrFileName, BITMAPFILEHEADER * pbmfh) { BOOL bSuccess ; DWORD dwBytesWritten ; HANDLE hFile ; hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ; if (hFile == INVALID_HANDLE_VALUE) return FALSE ; bSuccess = WriteFile (hFile, pbmfh, pbmfh->bfSize, &dwBytesWritten, NULL) ; CloseHandle (hFile) ; if (!bSuccess || (dwBytesWritten != pbmfh->bfSize)) { DeleteFile (pstrFileName) ; return FALSE ; } return TRUE ; } BITMAPFILEHEADER * DDBToDIB (HDC hdc, HBITMAP hBitmap,int BitCount) { BITMAP bm; int iOffset, iSizeImage ; BYTE *pBits; BITMAPFILEHEADER *pbfh; BITMAPINFO *pbi; if(NULL==hBitmap) return NULL; GetObject(hBitmap,sizeof(BITMAP),&bm); switch(BitCount) { case 1: case 4: case 8: iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<BitCount); break; case 16: case 24: case 32: iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); break; default: return NULL; } iSizeImage=(((bm.bmWidth*BitCount+31)/32)*4)*bm.bmHeight; pbfh=(BITMAPFILEHEADER *)malloc(iOffset+iSizeImage); if(NULL==pbfh) return NULL; pBits=(BYTE *)pbfh+iOffset; pbi=(BITMAPINFO *)(pbfh+1); pbfh->bfType=0x4D42; pbfh->bfSize=iOffset+iSizeImage; pbfh->bfReserved1=0; pbfh->bfReserved2=0; pbfh->bfOffBits=iOffset; pbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); pbi->bmiHeader.biWidth=bm.bmWidth; pbi->bmiHeader.biHeight=bm.bmHeight; pbi->bmiHeader.biPlanes=1; pbi->bmiHeader.biBitCount=BitCount; pbi->bmiHeader.biCompression=BI_RGB; pbi->bmiHeader.biSizeImage=iSizeImage; pbi->bmiHeader.biXPelsPerMeter=0; pbi->bmiHeader.biYPelsPerMeter=0; if(BitCount<16) { pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=(1<<BitCount); } else { pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=0; } GetDIBits(hdc,hBitmap,0,bm.bmHeight,pBits,pbi,DIB_RGB_COLORS); return pbfh; } BITMAPFILEHEADER * pbmfh=DDBToDIB(hdc,m_hBitmap,iBitCount);//iBitCount取值1.4.8.16.24.32 if(pbmfh) { DibSaveImage (strPath, pbmfh) ; free(pbmfh); }