本文主要是介绍MFC 截取对话框生成图片、截取整个屏幕(可取黑白反色或者整体图片取反色),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
HWND hwnd = ::GetDesktopWindow();//截整个屏幕,用从这往下4句HDC hdc = ::GetDC(hwnd);CDC dc;dc.Attach(hdc);CRect rc,rcw;GetWindowRect(&rcw);GetClientRect(&rc);//只截对话框,用这句//rc.SetRect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));//截整个屏幕,用这句int iBitPerPixel = dc.GetDeviceCaps(BITSPIXEL);int iWidth = rc.Width();int iHeight = rc.Height();int pointx = rcw.left;int pointy = rcw.top;CDC memDC;memDC.CreateCompatibleDC(&dc);CBitmap memBitmap, *oldBitmap;memBitmap.CreateCompatibleBitmap(&dc, iWidth, iHeight);oldBitmap = memDC.SelectObject(&memBitmap);memDC.BitBlt(0, 0, iWidth, iHeight, &dc, pointx, pointy, SRCCOPY);BITMAP bmp;memBitmap.GetBitmap(&bmp);FILE *fp = fopen("test22222.bmp", "wb");BITMAPINFOHEADER bih;memset(&bih, 0, sizeof(bih));bih.biBitCount = bmp.bmBitsPixel;bih.biCompression = BI_RGB;//表示不压缩bih.biHeight = bmp.bmHeight;bih.biPlanes = 1;//位平面数,必须为1bih.biSize = sizeof(BITMAPINFOHEADER);bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;bih.biWidth = bmp.bmWidth;BITMAPFILEHEADER bfh;memset(&bfh, 0, sizeof(bfh));bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;bfh.bfType = (WORD)0x4d42;//必须表示"BM"fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);fwrite(&bih, 1, sizeof(bih), fp);byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];GetDIBits(memDC.m_hDC, (HBITMAP)memBitmap.m_hObject, 0, iHeight, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);delete[] p;fclose(fp);memDC.SelectObject(oldBitmap);
取反色代码
HWND hwnd = ::GetDesktopWindow();//截整个屏幕,用从这往下4句HDC hdc = ::GetDC(hwnd);CDC dc;dc.Attach(hdc);CRect rc,rcw;GetWindowRect(&rcw);GetClientRect(&rc);//只截对话框,用这句//rc.SetRect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));//截整个屏幕,用这句int iBitPerPixel = dc.GetDeviceCaps(BITSPIXEL);int iWidth = rc.Width();int iHeight = rc.Height();int pointx = rcw.left;int pointy = rcw.top;CDC memDC;memDC.CreateCompatibleDC(&dc);memDC.SetROP2(R2_NOT);CBitmap memBitmap, *oldBitmap;memBitmap.CreateCompatibleBitmap(&dc, iWidth, iHeight);oldBitmap = memDC.SelectObject(&memBitmap);memDC.BitBlt(0,0 , iWidth, iHeight, &dc, pointx, pointy, SRCCOPY);BITMAP bmp;memBitmap.GetBitmap(&bmp);FILE *fp = fopen("Data\\test22222.bmp", "wb");BITMAPINFOHEADER bih;memset(&bih, 0, sizeof(bih));bih.biBitCount = bmp.bmBitsPixel;bih.biCompression = BI_RGB;//表示不压缩bih.biHeight = bmp.bmHeight;bih.biPlanes = 1;//位平面数,必须为1bih.biSize = sizeof(BITMAPINFOHEADER);bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;bih.biWidth = bmp.bmWidth;BITMAPFILEHEADER bfh;memset(&bfh, 0, sizeof(bfh));bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;bfh.bfType = (WORD)0x4d42;//必须表示"BM"fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);fwrite(&bih, 1, sizeof(bih), fp);byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];GetDIBits(memDC.m_hDC, (HBITMAP)memBitmap.m_hObject, 0, iHeight, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);int pixels = bmp.bmWidth *bmp.bmHeight;//for (int i = 0; i < pixels; i++)// 整体取反色//{// BYTE red = p[i * 4];// BYTE green = p[i * 4 + 1];// BYTE blue = p[i * 4 + 2];// p[i * 4] = 255 - red;// p[i * 4 + 1] = 255 - green;// p[i * 4 + 2] = 255 - blue;//}// 黑取白for (int i = 0; i < pixels; i++){BYTE red = p[i * 4];BYTE green = p[i * 4 + 1];BYTE blue = p[i * 4 + 2];if (red == 0 && green == 0 && blue == 0) {p[i * 4] = 255 - red;p[i * 4 + 1] = 255 - green;p[i * 4 + 2] = 255 - blue;}}fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);delete[] p;fclose(fp);memDC.SelectObject(oldBitmap);
这篇关于MFC 截取对话框生成图片、截取整个屏幕(可取黑白反色或者整体图片取反色)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!