C# 判斷兩張圖片是否一致的兩種方法
阿新 • • 發佈:2019-01-02
一般的情況下,人們習慣的輪詢影象中的每一個畫素進行比對,如果出現一個畫素點的不同則判斷兩張照片不一致。但這樣做的缺點是顯而易見的:大量的查詢會顯著拖慢系統速度,如果要比較的影象很多則可能導致系統掛掉。新的思路是把影象檔案的資料流轉化成一串Base64字串,然後只要比較這些字串就可以了。作者測試了256*256以下大小的一些圖片,結果完全正確而且速度明顯加快。來看他是如何實現的吧。
傳統的畫素比對方法:
private bool ImageCompareArray(Bitmap firstImage, Bitmap secondImage) { bool flag = true; string firstPixel; string secondPixel; if (firstImage.Width == secondImage.Width && firstImage.Height == secondImage.Height) { for (int i = 0; i < firstImage.Width; i++) { for (int j = 0; j < firstImage.Height; j++) { firstPixel = firstImage.GetPixel(i, j).ToString(); secondPixel = secondImage.GetPixel(i, j).ToString(); if (firstPixel != secondPixel) { flag = false; break; } } } if (flag == false) { return false; } else { return true; } } else { return false; } }
改良後的程式碼:
public static bool ImageCompareString(Bitmap firstImage, Bitmap secondImage) { MemoryStream ms = new MemoryStream(); firstImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); String firstBitmap = Convert.ToBase64String(ms.ToArray()); ms.Position = 0; secondImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); String secondBitmap = Convert.ToBase64String(ms.ToArray()); if (firstBitmap.Equals(secondBitmap)) { return true; } else { return false; } }
作者測試了大量圖片,只要改動一個畫素點,新方法都可以檢測出不同。不過目前為止還沒有對500*600解析度以上的影象進行測試。
執行大量測試以後,Base64方法的平均測試速度為每對照片0.1s。但是,使用傳統的陣列方法快慢則隨圖片而有明顯差別。如果是完全一致的圖片需要平均每對1.8s,檢測出不同則只需要平均每對0.05s。綜合看來新方法在速度上具有優勢。