截取两张图片相同的地方生成的图片为什么还是不相同

川娃子 2017-05-10 04:31:18
我在做图片对比的时候发现这种情况:
首先截取两张时间不一样的桌面截屏(两张图只有右下角的时间分钟数不一样)
代码:
private void ScreenCapture(string imagePath)
{
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;

using (Image bitmap = new Bitmap(width, height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bitmap.Size);
}
bitmap.Save(imagePath, ImageFormat.Jpeg);
}
GC.Collect();
}
然后截取这两张图片中除任务栏(排除掉时间不相同的部分)外的相同部分生成新的图片
代码:
public void CaptureImage(string fromFilePath, string toFilePath)
{
Image fromImage = Image.FromFile(sFromFilePath);
Bitmap bitmap = new Bitmap(fromImage.Width, fromImage.Height - 38);
Graphics graphic = Graphics.FromImage(bitmap);
graphic.DrawImage(fromImage, 0, 0, new Rectangle(0, 0, fromImage.Width, fromImage.Height - 38), GraphicsUnit.Point);
Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());
saveImage.Save(toFilePath, System.Drawing.Imaging.ImageFormat.Jpeg);
saveImage.Dispose();
bitmap.Dispose();
graphic.Dispose();
}
最后用提取文件MD5码值来判断文件是否相同
代码:
public string MD5Verify(string filePath)
{
string reslute = string.Empty;
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] b = md5.ComputeHash(fs);
for (int i = 0; i < b.Length; i++)
{
reslute += b[i].ToString("x2");
}
fs.Close();
md5.Clear();
}

return reslute;
}
生成的图片看着是一样的了,大小也一样,但MD5码值不一样,用记事本打开查看到最后面的字符串的确不一样。
我想知道问什么不一样,麻烦解释一下,还有就是这么才能一样?
...全文
304 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_lz 2017-05-11
  • 打赏
  • 举报
回复
你还不如说你到底要干嘛 如果是两个文件你要比对是否一样 用MD5 来判断 没什么问题 你说你的md5不一样 那也确实可能比一样 即使你图像的RGB完全一样 那么问题来了 难道一张图片文件 只有RGB数据?没有图像其他信息?你能确定其他信息是一样的?而且为了保证文件结构 数据并非紧凑在文件中排列 某个数据会在某个指定位置出现 而数据与数据之间可能纯在一些无用的数据 因为为了保证字节对齐 会在那些空白区域填充数据 而这个被填充的数据是什么那就说不清楚了 还有谁告诉你的时间就会在右下角出现?我的windows系统 任务栏从来都是被我设置到了左边显示的 反正如果是确定文件是否是同一份 我用MD5 但是要确定文件内容是否是一样的 我重来都是只比较数据 而不是文件 比如两个文本 内容都谁一样的 一个utf8保存 一个gb2312保存 你能指望它的md5一样 还有谁知道你保存出来的图片是否是压缩格式的
川娃子 2017-05-11
  • 打赏
  • 举报
回复
MD5判断文件是否相同只是方法之一,还有没有其他方法将两张图片中相似的地方(肉眼识别)用程序判断相同 我的方法是行不通了,能提供行之有效的方法吗?最好有代码或实例 我能想到的是有相似度算法,但有没有简单有效的?
川娃子 2017-05-10
  • 打赏
  • 举报
回复
那怎样才能截取到相同部分并使之相同, 相似也行, 查了一下图片的相似度算法好麻烦.
wanghui0380 2017-05-10
  • 打赏
  • 举报
回复
很早以前就有利用图片加带信息的技术,他就是一样的做法。 通过FFT运算在低通值部分加入需要隐藏的信息,在反成图片。这张图片在人眼看起来,他和原始图片没有任何区别。但是这里面的byte可不一样,自然这两张图的md5也不一样
wanghui0380 2017-05-10
  • 打赏
  • 举报
回复
额,图片是用像素构成的,像素在图片里用byte保存,md5依靠byte计算 那么问题来了,你人眼觉着,R255,G200,B100 跟R255,G200,B101 有多大区别?估计你人眼会说没区别。但md5会说有区别
xdashewan 2017-05-10
  • 打赏
  • 举报
回复
图片在windows文件系统中是带有文件头的,一般会记录文件尺寸格式创建修改时间备注等信息,所以不是简单把图片文件MD5对比就行的

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧