MFC 截取对话框生成图片、截取整个屏幕(可取黑白反色或者整体图片取反色)

cpp 复制代码
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;//位平面数,必须为1
	bih.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);

取反色代码

cpp 复制代码
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;//位平面数,必须为1
	bih.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);
相关推荐
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮5 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
样例过了就是过了7 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
谭欣辰7 小时前
C++ 排列组合完整指南
开发语言·c++·算法
橙子也要努力变强8 小时前
信号捕捉底层机制-机理篇2
linux·服务器·c++
盐焗鹌鹑蛋8 小时前
【C++】stack和queue类
c++
郝学胜-神的一滴9 小时前
罗德里格斯旋转公式(Rodrigues‘ Rotation Formula)完整推导
c++·unity·godot·图形渲染·three.js·unreal
lzh200409199 小时前
深入理解进程:从PCB内核结构到写时拷贝的底层实战
linux·c++
aseity9 小时前
跨平台项目中QString 与 非Qt 跨平台动态库在字符集上的一个实用的互操作约定.
c++·经验分享
CN-Dust10 小时前
【C++】while语句例题专题
数据结构·c++·算法