怎样用API写位图文件
我可以用API的LoadImage函数读取.bmp的图片文件并提取其像素数组进行处理
但是处理好之后我怎样.bmp的文件啊?
处理好的图像我存在HBITMAP类型的变量中。
求大侠指导!
[解决办法]
void ScreenCapture(int bitCount,bool isDrawCursor){ int color_num = bitCount <= 8 ? 1 << bitCount : 0; int nBISize = sizeof(BITMAPINFOHEADER) + (color_num * sizeof(RGBQUAD)); BITMAPINFO *lpbmi = (BITMAPINFO *) new BYTE[nBISize]; int nWidth=GetSystemMetrics(SM_CXSCREEN); int nHeight=GetSystemMetrics(SM_CYSCREEN); BITMAPINFOHEADER *lpbmih = &(lpbmi->bmiHeader); lpbmih->biSize = sizeof(BITMAPINFOHEADER); lpbmih->biWidth = nWidth; lpbmih->biHeight = nHeight; lpbmih->biPlanes = 1; lpbmih->biBitCount = bitCount; lpbmih->biCompression = BI_RGB; lpbmih->biXPelsPerMeter = 0; lpbmih->biYPelsPerMeter = 0; lpbmih->biClrUsed = 0; lpbmih->biClrImportant = 0; lpbmih->biSizeImage = (((lpbmih->biWidth * lpbmih->biBitCount + 31) & ~31) >> 3) * lpbmih->biHeight; HDC hDC = GetDC(NULL); HDC hMemDC=CreateCompatibleDC(hDC); HBITMAP hBmp = CreateCompatibleBitmap(hMemDC, 1, 1); // 高宽不能为0 GetDIBits(hMemDC, hBmp, 0, 0, NULL, lpbmi, DIB_RGB_COLORS); LPBYTE m_lpvFullBits=NULL; HPALETTE hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE ); //得到系统默认调色板 hPal = SelectPalette(hMemDC,hPal,FALSE); HBITMAP lpbitmap=CreateDIBSection(hMemDC, lpbmi, DIB_RGB_COLORS, (void**)&m_lpvFullBits, NULL, NULL); HGDIOBJ hOldObject=SelectObject(hMemDC,(HGDIOBJ)lpbitmap); BitBlt(hMemDC,0,0,nWidth,nHeight,hDC,0,0,SRCCOPY); if(isDrawCursor) { POINT pt; ICONINFO iconinfo; GetCursorPos(&pt); HCURSOR hIcon=GetCursor(); if(GetIconInfo(hIcon,&iconinfo)) { pt.x-=iconinfo.xHotspot; pt.y-=iconinfo.yHotspot; if(iconinfo.hbmColor!=NULL) DeleteObject(iconinfo.hbmColor); if(iconinfo.hbmMask!=NULL) DeleteObject(iconinfo.hbmMask); } DrawIconEx(hMemDC,pt.x,pt.y,hIcon,0,0,0,NULL,DI_NORMAL | DI_COMPAT); } BITMAPFILEHEADER bh; ZeroMemory(&bh,sizeof(bh)); bh.bfOffBits=sizeof(BITMAPFILEHEADER)+nBISize; bh.bfSize=bh.bfOffBits+lpbmih->biSizeImage; bh.bfType=0x4d42; HANDLE hFile=INVALID_HANDLE_VALUE; __try { HANDLE hFile=CreateFile(L"Desktop.bmp",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); DWORD dwBytesWritten=0; if(!WriteFile(hFile,&bh,sizeof(bh),&dwBytesWritten,NULL)) __leave; if(!WriteFile(hFile,lpbmi,nBISize,&dwBytesWritten,NULL)) __leave; if(!WriteFile(hFile,m_lpvFullBits,lpbmi->bmiHeader.biSizeImage,&dwBytesWritten,NULL)) __leave; } __finally { if(hFile!=INVALID_HANDLE_VALUE) CloseHandle(hFile); SelectObject(hMemDC,hOldObject); DeleteDC(hMemDC); ReleaseDC(NULL,hDC); DeleteObject(lpbitmap); DeleteObject(hBmp); delete [] lpbmi; }}
[解决办法]
了解Bitmap图像格式后,跟写普通的文件没有什么区别.
如果楼主想真正弄懂,那必须要学习学习Bitmap图像格式,其实也挺简单的.