#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以内
分享到:
相关推荐
c++代码 截屏并保存为bmp。代码非常简洁。好好看看吧。
编程语言:C++ 开发环境:VS2019 功能:截屏为BMP图片,分割BMP图片 说明:完整工程,用VS直接打开,只需要修改一下图片的位置。
C++实现截屏保存屏幕上的一块区域为.bmp文件,是在给一个动力工程学院学姐做的一个项目里用的一个功能函数。
WIN32做的截屏软件,只能保存图片为bmp格式,截好吐后在,截选框内右键另存。保存后程序自动最小化至托盘,可按快捷键ALT+X,呼出继续截图,在托盘图标上右键,退出截图程序……
截取屏幕数据,转为bmp,转为jpg,压缩jpg
c++ 截取屏幕图片并保存 实现抓取屏幕功能,并且保存为bmp文件
DOS环境下面,实现屏幕截屏操作,生成BMP文件,附源码(C)
VS2010开发环境,具体代码详见程序,关于BMP位图格式可以搜集一下网上资料进行了解
截图保存为bmp,利用了CxImage库,转换成jpg。这次传的是Release版的,虽然还没加上注释,不过初学者学习应该还行。运行完,可应用程序是160KB。实用方法,点击自定义截图,画个矩形,任意位置双击保存,如果只有...
使用Ctrl+s快捷键弹出保存bmp文件对话框 使用Esc快捷键取消截屏 当用户操作完后,程序并不会退出,用户可以反复的使用热键进行截屏,知道用户手动结束程序。 为了不引起大家的误会,所以这里并没有采用自启动方式...
6、自定义截图区域内,【右键单击】,可保存文件,分别有png,bmp, jpg格式 7、自定义截图区域内,【左键双击】,可保存截图到剪切板,以便粘贴到其他处 8、鼠标移动,可实现【放大镜】显示当前鼠标位置 9、...
不需root,用C++方法将截图信息解析成了BMP,具体可以参考程序
功能是将屏幕截屏并保存到硬盘上. 使用方法:: divilis@DIVILIS-PC /D/LAB/projects/CommandlineScreenCaptureTool $ ./CommandlineScreenCaptureTool.exe --help This commandline tool is written by divilis. ...
这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! 如题。详细见源码。 GMem 内存管理单元源码。GMem.cpp...
VC++ 实现屏幕截图程序,由鼠标左键选择区域,双击保存为bmp
6、自定义截图区域内,【右键单击】,可保存文件,分别有png,bmp, jpg格式 7、自定义截图区域内,【左键双击】,可保存截图到剪切板,以便粘贴到其他处 8、鼠标移动,可实现【放大镜】显示当前鼠标位置 9、【关闭】...
这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...
libjpeg-turbo使用实例代码。包含jpeg解码成dib格式 绘制到界面上;jpeg格式图片转换成bmp格式图片;bmp格式图片转换成bmp格式图片。
内容索引:VC/C++源码,图形处理,抓图,截屏 VC++指定区域抓图、截屏小程序,支持全屏、指定区、窗口捕捉或者是其它对象,抓取后自动显示在工作区中,并可以保存为BMP,作者没有加入保存为其它图像的功能……
一个桌面截屏程序代码,没有界面,类似于qq截图功能,可以保存bmp格式图片,双击到剪贴板, 不支持截取动态的视频 ctrl+a 截图 alt+q退出程序