如何比较两个图片是否相同 硬盘上的图片是什么格式?jpg?bmp比全部图像还是部分? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 jpg或bmp都可以,最好就是比较部分就是更好了好像vbs 有个方法 FindPic 不知道用c#如何才能做到和这个方法一样的功能 找找hough算子和隐Makrkov模型方面的资料看看... liujia_0421 你好,绝对的相同的是如何做的,先做简单再做复杂的,能说出来大家探讨一下吗 我是这样获得一幅图片的并保存起来的 this.Hide(); Thread.Sleep(2000); SendKeys.SendWait("%{PRTSC}"); Bitmap myCapture = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap); myCapture.Save(@"C:\myCapture.bmp", System.Drawing.Imaging.ImageFormat.Bmp);现在是如何再通过SendKeys.SendWait("%{PRTSC}"); Bitmap myCapture = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);叛断“myCapture” 与“C:\myCapture.bmp ”是否相同 绝对的相同就是比较每个bit…… 谢谢aihui109 能提供一下把二进流的形式读取图片文件的源码吗 //存下来比较文件private bool SameBytes(byte[] ABuffer1, byte[] ABuffer2){ if (ABuffer1.Length != ABuffer2.Length) return false; for (int i = 0; i < ABuffer1.Length; i++) if (ABuffer1[i] != ABuffer2[i]) return false; return true;}private bool SameFile(string AFileName1, string AFileName2){ FileInfo vFileInfo1 = new FileInfo(AFileName1); FileInfo vFileInfo2 = new FileInfo(AFileName2); if (vFileInfo1.Length != vFileInfo2.Length) return false; FileStream vFileStream1 = new FileStream(AFileName1, FileMode.Open, FileAccess.Read, FileShare.Read); FileStream vFileStream2 = new FileStream(AFileName2, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] vBuffer1 = new byte[0x1000]; byte[] vBuffer2 = new byte[0x1000]; int vReadLength1 = vFileStream1.Read(vBuffer1, 0, vBuffer1.Length); int vReadLength2 = vFileStream2.Read(vBuffer2, 0, vBuffer2.Length); while ((vReadLength1 > 0) && (vReadLength2 > 0)) { vReadLength1 = vFileStream1.Read(vBuffer1, 0, vBuffer1.Length); vReadLength2 = vFileStream2.Read(vBuffer2, 0, vBuffer2.Length); if (!SameBytes(vBuffer1, vBuffer2)) return false; } vFileStream1.Close(); vFileStream2.Close(); return true;}private void button1_Click(object sender, EventArgs e){ Text = SameFile(@"C:\myCapture.bmp", @"C:\myCapture2.bmp").ToString();} 用二进流的形式读取图片文件,然后比较两个流是或一样.这个办法是经过试验的,决对可行!~~~…………………………………………………………………………正解。任何文件都可以解读成2进制流。搂住现在只需要关心怎么把获取的截图转化为2进制流。=======================================================================================直接用ToBase64转换编码得到编码序列,直接比较也可以. 谢谢楼上两们大哥,对了“直接用ToBase64转换编码得到编码序列,直接比较也可以”方法源码又是怎写的,能贴出来吗 我用读流的方法试了,如果不是用复制的两幅图来比较,用剪出来的两幅一样图来比较,还是返回false的 楼主,你错了.你剪出来的两幅图不可能一样.只要差一点都返回false;用二进制流来比较是决对可行的.是决对准确的!~~~ 楼主,你错了.你剪出来的两幅图不可能一样.只要差一点都返回false;用二进制流来比较是决对可行的.是决对准确的!~~~ 如果,你们公司舍得换钱,用mil试试,matrox image library.它提供了丰富的图像识别,也包括对比的函数库。 楼主要做的事情跟下面这个类似,人家的思路是比对前后两幅图片,只要80%相同就OK,设置一个阀值比如80%,看起来不起眼,其实很关键,这就是技巧。http://www.codeproject.com/csharp/motion_detection.asp ruan_hg(阿阮) 说得很正确,便是这个阀值是如何提取出来的呀 我有一个思路,可以利用程序从图片中抽取一定的样本点然后比较样本点的RGB值相对差异 我看过一些按键精灵方面的软件,它们抓图对比都是比较准确和快捷的例如这个方法就是它们抓图语句:VBSCall FindPic(575,299,628,340,"c:\图片.bmp",1,x,y) VBSCall Call FindPicVBSCall Call FindPic(iLeft,iTop,iRight,iBottom,szFileName,fSimilar,ByRef FoundX,ByRef FoundY)'这个函数用于在屏幕范围内查找图片这个功能允许您在屏幕的某个区域查找指定相似度的图片,并把找到的坐标保存在变量中格式VBSCall Call FindPic(left,top,right,bottom,filename,similar,x,y)在区域内从左到右,从上到下找文件名为filename的bmp文件,把找到的坐标保存在变量x和y中left,top,right,bottom都是整数或者整数型变量,说明了区域的左,上,右,下界限filename是一个bmp格式的图片,需要您自己抓取,最好是24位,把边缘都设为单一的颜色similar为相似度,取0.5到1之间的小数。数值越大,对图片的相似度要求越严格,速度也越快。推荐取0.9如果没有找到图片,则x和y的值都被置为-1推荐使用周围颜色单一的图片。如下图,右边的QQ图片比左边的好用的多例子VBSCall Call FindPic(0,0,1023,767,"1.bmp",0.9,x,y)If x>=0 and y>=0MoveTo x yEndIf 在区域(0,0,1023,767)中找与文件1.bmp中的图形比较接近的地方,如果找到,则把鼠标移动到这个地方c#该如何做出这方面的功能呢 C# tcp 传输的问题.. Xml节点反序列化问题 请教: C# Socket 编程应该如何传输一个结构体? 请教C#取硬盘编号 高分求教:c# socket 异步单线程SOCKET SERVER 生成Excel,在线等 问一个比较懦的问题.关于winform 类似QQ申请精灵那样的解决大量重连工作,该怎样做? 如何在C#中控制水晶报表中图表坐标轴标签的显示? 文本数据转为数组? .net2005 怎么去除控件获取焦点时画的方型虚线? 最好的方法是什么呢? 这样的服务器配置运行.net开发的软件为什么这么慢,急啊!!要下岗了
好像vbs 有个方法 FindPic 不知道用c#如何才能做到和这个方法一样的功能
this.Hide();
Thread.Sleep(2000);
SendKeys.SendWait("%{PRTSC}");
Bitmap myCapture = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
myCapture.Save(@"C:\myCapture.bmp", System.Drawing.Imaging.ImageFormat.Bmp);现在是如何再通过
SendKeys.SendWait("%{PRTSC}");
Bitmap myCapture = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);叛断“myCapture” 与“C:\myCapture.bmp ”是否相同
{
if (ABuffer1.Length != ABuffer2.Length) return false;
for (int i = 0; i < ABuffer1.Length; i++)
if (ABuffer1[i] != ABuffer2[i]) return false;
return true;
}private bool SameFile(string AFileName1, string AFileName2)
{
FileInfo vFileInfo1 = new FileInfo(AFileName1);
FileInfo vFileInfo2 = new FileInfo(AFileName2);
if (vFileInfo1.Length != vFileInfo2.Length) return false;
FileStream vFileStream1 = new FileStream(AFileName1,
FileMode.Open, FileAccess.Read, FileShare.Read);
FileStream vFileStream2 = new FileStream(AFileName2,
FileMode.Open, FileAccess.Read, FileShare.Read); byte[] vBuffer1 = new byte[0x1000];
byte[] vBuffer2 = new byte[0x1000];
int vReadLength1 = vFileStream1.Read(vBuffer1, 0, vBuffer1.Length);
int vReadLength2 = vFileStream2.Read(vBuffer2, 0, vBuffer2.Length);
while ((vReadLength1 > 0) && (vReadLength2 > 0))
{
vReadLength1 = vFileStream1.Read(vBuffer1, 0, vBuffer1.Length);
vReadLength2 = vFileStream2.Read(vBuffer2, 0, vBuffer2.Length);
if (!SameBytes(vBuffer1, vBuffer2)) return false;
}
vFileStream1.Close();
vFileStream2.Close();
return true;
}private void button1_Click(object sender, EventArgs e)
{
Text = SameFile(@"C:\myCapture.bmp", @"C:\myCapture2.bmp").ToString();
}
用二进流的形式读取图片文件,然后比较两个流是或一样.
这个办法是经过试验的,决对可行!~~~
…………………………………………………………………………
正解。任何文件都可以解读成2进制流。搂住现在只需要关心怎么把获取的截图转化为2进制流。
=======================================================================================直接用ToBase64转换编码得到编码序列,直接比较也可以.
“直接用ToBase64转换编码得到编码序列,直接比较也可以”方法源码又是怎写的,能贴出来吗
用二进制流来比较是决对可行的.是决对准确的!~~~
用二进制流来比较是决对可行的.是决对准确的!~~~
它提供了丰富的图像识别,也包括对比的函数库。
http://www.codeproject.com/csharp/motion_detection.asp
然后比较样本点的RGB值相对差异
例如这个方法就是它们抓图语句:
VBSCall FindPic(575,299,628,340,"c:\图片.bmp",1,x,y)
VBSCall Call FindPic(iLeft,iTop,iRight,iBottom,szFileName,fSimilar,ByRef FoundX,ByRef FoundY)
'这个函数用于在屏幕范围内查找图片
这个功能允许您在屏幕的某个区域查找指定相似度的图片,并把找到的坐标保存在变量中
格式
VBSCall Call FindPic(left,top,right,bottom,filename,similar,x,y)
在区域内从左到右,从上到下找文件名为filename的bmp文件,把找到的坐标保存在变量x和y中
left,top,right,bottom都是整数或者整数型变量,说明了区域的左,上,右,下界限
filename是一个bmp格式的图片,需要您自己抓取,最好是24位,把边缘都设为单一的颜色
similar为相似度,取0.5到1之间的小数。数值越大,对图片的相似度要求越严格,速度也越快。推荐取0.9
如果没有找到图片,则x和y的值都被置为-1
推荐使用周围颜色单一的图片。如下图,右边的QQ图片比左边的好用的多例子
VBSCall Call FindPic(0,0,1023,767,"1.bmp",0.9,x,y)
If x>=0 and y>=0
MoveTo x y
EndIf 在区域(0,0,1023,767)中找与文件1.bmp中的图形比较接近的地方,如果找到,则把鼠标移动到这个地方c#该如何做出这方面的功能呢