本文演示如何比较两张图片是否完全相同。

(注意:如果是比较两张图片是否相似,则比较复杂,涉及到机器学习)

方法一:把图片保存到内存流中,然后转化成 Base64 字符串进行比较

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO; namespace CompareImage
{
class Program
{
static string sourceImageString;
static string targetImageString;
static List<string> _paths = new List<string>(); static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); string targetImageString = GetImageBase64String(@"xxx");
//待比较的图片文件路径集合
ProcessDirectory(@"yyy"); foreach (var filePath in _paths)
{
string sourceImageString = GetImageBase64String(filePath); if (targetImageString.Equals(sourceImageString))
{
Console.WriteLine("same");
}
else
{
Console.WriteLine("different");
}
} stopwatch.Stop();
Console.WriteLine("比较了 " + _paths.Count + " 张照片,总用时:" + stopwatch.ElapsedMilliseconds + " 毫秒"); Console.ReadLine();
} // 根据传入的文件夹路径,递归查出它包含的所有文件和文件夹,并处理各个文件夹下包含的文件
public static void ProcessDirectory(string targetDirectory)
{
// 处理 targetDirectory 路径下的文件列表
string[] fileEntries = Directory.GetFiles(targetDirectory); foreach (string fileName in fileEntries)
{
ProcessFile(fileName);
} // 递归到 targetDirectory 路径下的子路径中
string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory); foreach (string subdirectory in subdirectoryEntries)
{
ProcessDirectory(subdirectory);
}
} // 这里添加如何处理找到的文件的逻辑
public static void ProcessFile(string path)
{
if (!path.Contains(".db"))
_paths.Add(path);
} static string GetImageBase64String(string imagePath)
{
string imageString = string.Empty;
using (MemoryStream memoryStream = new MemoryStream())
{
using (Image image = Image.FromFile(imagePath))
{
image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
imageString = Convert.ToBase64String(memoryStream.ToArray());
}
} return imageString;
}
}
}

方法二:按图片尺寸依次比较各个像素值(要求图片尺寸一样)

using System;
using System.Diagnostics;
using System.Drawing; namespace CompareImage
{
class Program
{
static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); int countSame = ;
int countDifferent = ; Bitmap bitmapSource = new Bitmap(@"xxx");
Bitmap bitmapTarget = new Bitmap(@"yyy"); //照片尺寸必须一样
for (int i = ; i < bitmapTarget.Width; i++)
{
for (int j = ; j < bitmapTarget.Height; j++)
{
if (bitmapSource.GetPixel(i, j).Equals(bitmapTarget.GetPixel(i, j)))
{
countSame++;
}
else
{
countDifferent++;
}
}
} stopwatch.Stop();
Console.WriteLine("相同像素个数:" + countSame + ",不同像素个数:" + countDifferent + "用时:" + stopwatch.ElapsedMilliseconds + " 毫秒"); Console.ReadLine();
}
}
}

最新文章

  1. 最小生成树---Prim算法和Kruskal算法
  2. Apple WatchKit 初探
  3. IOC容器中bean的生命周期
  4. RecyclerView添加头部和底部视图的实现
  5. db2 字符串转换 数字
  6. oracle 之路目录
  7. 【转】通过CMD命令设置定时关机及ShutDown命令大全
  8. sql基础,必须会的————随便整理、杂乱无章
  9. boolean attribute(布尔值属性) attribute vs property
  10. Node.js学习 - Route
  11. c++非STL全排列
  12. Lingo求解线性规划案例3——混料问题
  13. Jmeter+Ant+Jenkins 接口自动化之简单demo
  14. poj 1321 棋盘问题(n行中放任意k行)
  15. laravel 命令行测试 Uncaught ReflectionException: Class config does not exist
  16. javax.validation.UnexpectedTypeException: No validator could be found for constraint 'org.hibernate.validator.constraints.Length' validating type
  17. 大话存储4——RAID磁盘阵列
  18. Mininet实验 测量路径损耗率
  19. linux mint sublime3的c编译环境配置
  20. 【期望】【P5081】Tweetuzki 爱取球

热门文章

  1. php中 重载的方法
  2. Django项目:CRM(客户关系管理系统)--12--05PerfectCRM实现King_admin注册功能获取内存01
  3. thinkphp5.1学习总结
  4. LintCode_420 报数
  5. laravel 图片
  6. Node.js入门笔记
  7. JavaScript 开发的40个经典技巧
  8. C++之ARX 读取配置文件内容时,会出现编码问题(utf-8转unicode)
  9. List容器-ArrayList
  10. 快速启动Oracle服务