`
kzby2003
  • 浏览: 29602 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

C++截屏当前活动窗口保存成BMP文件以及BMP文件的比较

阅读更多
#include <time.h>
#include <afxwin.h>
#include <stdio.h>
#include <comdef.h>
#include <iostream>
#include <atlimage.h>

/*
 * hwnd:要截图的窗口的句柄
 * fileName:要比较的图片的路径
 * offsets:有4个成员的int型数组,用于设置比较图片时,上、下、左、右的偏移量
 * offsets[0]:左
 * offsets[1]:上
 * offsets[2]:右
 * offsets[3]:下
 */
bool print_screen(HWND hwnd, const char* fileName, int offsets[])
{
	LPCTSTR pFileName = NULL;

	if(sizeof(TCHAR)==sizeof(char))
    {
        pFileName=(LPCTSTR)fileName;
    }
    else
    {
        int length= sizeof(TCHAR)*(strlen(fileName)+1);
        LPTSTR tcBuffer=new TCHAR[length];
        memset(tcBuffer,0,length);
        MultiByteToWideChar(CP_ACP,0,fileName,strlen(fileName),tcBuffer,length);
        pFileName=(LPCTSTR)tcBuffer ;
    }
	long t_start = ::GetTickCount();
	CDC dc;
	CDC *pDC = &dc;//屏幕DC

        // HWND hwnd = ::GetForegroundWindow(); // 获得当前活动窗口
	HDC activeDC = ::GetWindowDC(hwnd);   //获得要截屏的窗口的hDC

	pDC->Attach(activeDC);//获取当前活动窗口的DC
	RECT rect;
	::GetWindowRect(hwnd,&rect);//得到窗口的大小
	int Width = rect.right - rect.left;

	int Height = rect.bottom - rect.top;

	/*cout << "Width:" << Width << endl

	<< "Height:" << Height << endl << endl;*/

	CDC memDC;//内存DC

	memDC.CreateCompatibleDC(pDC);

	CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap

	memBitmap.CreateCompatibleBitmap(pDC, Width, Height);

	oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC

	memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC
        //以下代码保存memDC中的位图到文件

	BITMAP bmp;

	memBitmap.GetBitmap(&bmp);//获得位图信息

	FILE *fp = fopen("C:\\abc.bmp", "w+b");
	BITMAPINFOHEADER bih = {0};//位图信息头

	bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小

	bih.biCompression = BI_RGB;

	bih.biHeight = bmp.bmHeight;//高度

	bih.biPlanes = 1;

	bih.biSize = sizeof(BITMAPINFOHEADER);

	bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小

	bih.biWidth = bmp.bmWidth;//宽度

	BITMAPFILEHEADER bfh = {0};//位图文件头

	bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量

	bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小

	bfh.bfType = (WORD)0x4d42;

	fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头

	fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头

	byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据

	GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,

		(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据

	fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);//写入位图数据

	delete [] p;

	fclose(fp);

        // 以下代码用于比较指定的BMP文件与内存中的截图
	CImage img;
	img.Load(pFileName);
	int nWidth = img.GetWidth();//获取图像宽度
	int nHeight = img.GetHeight();//获取图像高度
	if (Width != nWidth || Height != nHeight)
	{
		return false;
	}
	byte* pRealData;
	pRealData=(byte*)img.GetBits();

	int pit=img.GetPitch();

	int bitCount=img.GetBPP()/8;

	for (int y = offsets[1]; y < Height - offsets[3]; ++y)
	{
		for (int x = offsets[0]; x < Width - offsets[2]; ++x)
		{
			int pity = pit * y;
			int pitx = x*bitCount;
			if (up[bmp.bmWidth * (bmp.bmHeight - y - 1) + x] != 
(*(pRealData + pity + pitx + 2) << 16) + (*(pRealData + pity + pitx + 1) << 8) + 
*(pRealData + pity + pitx))
			{
				printf("(%d, %d) = %x, ",x, y, up[bmp.bmWidth *
 (bmp.bmHeight - y - 1) + x]);
				printf("(%d, %d) = %x\n",x, y, (*(pRealData + 
pity + pitx + 2) << 16) + (*(pRealData + pity + pitx + 1) << 8) + *(pRealData + 
pity + pitx));
				return false;
			}
		}
	}
	return true;
}

/*
 * hwnd:要截图的窗口的句柄
 * fileName:要比较的图片的路径
 * left:比较图片时的左偏移量
 * top:比较图片时的上偏移量
 * right:比较图片时的右偏移量
 * bottom:比较图片时的下偏移量
 */
int screenPrint(HWND hwnd, const char* fileName, int left, int top, int right, int bottom)
{
	if (left < 0 || top < 0 || right < 0 || bottom < 0)
	{
		return -1;
	}
	int offsets[4];
	offsets[0] = left;
	offsets[1] = top;
	offsets[2] = right;
	offsets[3] = bottom;
	bool isTheSame = print_screen(hwnd, fileName, offsets);
	if (isTheSame)
	{
		return 0;
	}
	else
	{
		return -1;
	}
}

速度尚可,比较两张1024 * 768的图片,耗时200ms以内
分享到:
评论

相关推荐

    截屏并保存为bmp c++

    c++代码 截屏并保存为bmp。代码非常简洁。好好看看吧。

    vs C++ 截屏为BMP图片,分割BMP图片

    编程语言:C++ 开发环境:VS2019 功能:截屏为BMP图片,分割BMP图片 说明:完整工程,用VS直接打开,只需要修改一下图片的位置。

    C++实现截屏保存屏幕上的一块区域为.bmp文件

    C++实现截屏保存屏幕上的一块区域为.bmp文件,是在给一个动力工程学院学姐做的一个项目里用的一个功能函数。

    VC++ 截屏软件,可保存为bmp图片

    WIN32做的截屏软件,只能保存图片为bmp格式,截好吐后在,截选框内右键另存。保存后程序自动最小化至托盘,可按快捷键ALT+X,呼出继续截图,在托盘图标上右键,退出截图程序……

    C++截屏,bmp转jpg,jpg压缩

    截取屏幕数据,转为bmp,转为jpg,压缩jpg

    c++ 截取屏幕图片并保存

    c++ 截取屏幕图片并保存 实现抓取屏幕功能,并且保存为bmp文件

    BMPlib.zip_C++ 截屏_DOS bmp_bmplib_截屏

    DOS环境下面,实现屏幕截屏操作,生成BMP文件,附源码(C)

    MFC截取窗体图片并保存BMP

    VS2010开发环境,具体代码详见程序,关于BMP位图格式可以搜集一下网上资料进行了解

    自己写的截图/截屏源代码

    截图保存为bmp,利用了CxImage库,转换成jpg。这次传的是Release版的,虽然还没加上注释,不过初学者学习应该还行。运行完,可应用程序是160KB。实用方法,点击自定义截图,画个矩形,任意位置双击保存,如果只有...

    c/c++ 屏幕截图

    使用Ctrl+s快捷键弹出保存bmp文件对话框 使用Esc快捷键取消截屏 当用户操作完后,程序并不会退出,用户可以反复的使用热键进行截屏,知道用户手动结束程序。 为了不引起大家的误会,所以这里并没有采用自启动方式...

    类似于qq截屏代码

    6、自定义截图区域内,【右键单击】,可保存文件,分别有png,bmp, jpg格式 7、自定义截图区域内,【左键双击】,可保存截图到剪切板,以便粘贴到其他处 8、鼠标移动,可实现【放大镜】显示当前鼠标位置 9、...

    Android截屏以及解析截屏程序源代码

    不需root,用C++方法将截图信息解析成了BMP,具体可以参考程序

    NEW 命令行截图工具

    功能是将屏幕截屏并保存到硬盘上. 使用方法:: divilis@DIVILIS-PC /D/LAB/projects/CommandlineScreenCaptureTool $ ./CommandlineScreenCaptureTool.exe --help This commandline tool is written by divilis. ...

    vc++ 开发实例源码包

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! 如题。详细见源码。 GMem 内存管理单元源码。GMem.cpp...

    VC++ 实现屏幕截图程序

    VC++ 实现屏幕截图程序,由鼠标左键选择区域,双击保存为bmp

    截图工具(仿QQ截图,大致功能都已实现)

    6、自定义截图区域内,【右键单击】,可保存文件,分别有png,bmp, jpg格式 7、自定义截图区域内,【左键双击】,可保存截图到剪切板,以便粘贴到其他处 8、鼠标移动,可实现【放大镜】显示当前鼠标位置 9、【关闭】...

    vc++ 应用源码包_6

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...

    libjpeg-turbo编码、解码实例代码

    libjpeg-turbo使用实例代码。包含jpeg解码成dib格式 绘制到界面上;jpeg格式图片转换成bmp格式图片;bmp格式图片转换成bmp格式图片。

    VC++指定区域抓图、截屏小程序

    内容索引:VC/C++源码,图形处理,抓图,截屏 VC++指定区域抓图、截屏小程序,支持全屏、指定区、窗口捕捉或者是其它对象,抓取后自动显示在工作区中,并可以保存为BMP,作者没有加入保存为其它图像的功能……

    MFC桌面截图 类似于qq截图功能

    一个桌面截屏程序代码,没有界面,类似于qq截图功能,可以保存bmp格式图片,双击到剪贴板, 不支持截取动态的视频 ctrl+a 截图 alt+q退出程序

Global site tag (gtag.js) - Google Analytics