本文演示如何比較兩張圖片是否完全相同。
(注意:如果是比較兩張圖片是否相似,則比較復雜,涉及到機器學習)
方法一:把圖片保存到內存流中,然后轉化成 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 = 0; int countDifferent = 0; Bitmap bitmapSource = new Bitmap(@"xxx"); Bitmap bitmapTarget = new Bitmap(@"yyy"); //照片尺寸必須一樣 for (int i = 0; i < bitmapTarget.Width; i++) { for (int j = 0; 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(); } } }