C#中影象一致性比較的簡易演算法

leejin_521發表於2010-11-18

MSDN的一位技術人員告訴大家一個在C#中進行影象一致性比較的簡易演算法。一般的情況下,人們習慣的輪詢影象中的每一個畫素進行比對,如果出現一個畫素點的不同則判斷兩張照片不一致。但這樣做的缺點是顯而易見的:大量的查詢會顯著拖慢系統速度,如果要比較的影象很多則可能導致系統掛掉。新的思路是把影象檔案的資料流轉化成一串Base64字串,然後只要比較這些字串就可以了。作者測試了256*256以下大小的一些圖片,結果完全正確而且速度明顯加快。來看他是如何實現的吧。

傳統的畫素比對方法:

   1: private bool ImageCompareArray(Bitmap firstImage, Bitmap secondImage)
   2: {
   3:     bool flag = true;
   4:     string firstPixel;
   5:     string secondPixel;
   6: 
   7:     if (firstImage.Width == secondImage.Width
   8:         && firstImage.Height == secondImage.Height)
   9:     {
  10:         for (int i = 0; i < firstImage.Width; i++)
  11:         {
  12:             for (int j = 0; j < firstImage.Height; j++)
  13:             {
  14:                 firstPixel = firstImage.GetPixel(i, j).ToString();
  15:                 secondPixel = secondImage.GetPixel(i, j).ToString();
  16:                 if (firstPixel != secondPixel)
  17:                 {
  18:                     flag = false;
  19:                     break;
  20:                 }
  21:             }
  22:         }
  23: 
  24:         if (flag == false)
  25:         {
  26:             return false;
  27:         }
  28:         else
  29:         {
  30:             return true;
  31:         }
  32:     }
  33:     else
  34:     {
  35:         return false;
  36:     }
  37: }


改良後的程式碼:

   1: public static bool ImageCompareString(Bitmap firstImage, Bitmap secondImage)
   2: {
   3:     MemoryStream ms = new MemoryStream();
   4:     firstImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
   5:     String firstBitmap = Convert.ToBase64String(ms.ToArray());
   6:     ms.Position = 0;
   7: 
   8:     secondImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
   9:     String secondBitmap = Convert.ToBase64String(ms.ToArray());
  10: 
  11:     if (firstBitmap.Equals(secondBitmap))
  12:     {
  13:         return true;
  14:     }
  15:     else
  16:     {
  17:         return false;
  18:     }
  19: }

相關文章