C# 判斷兩張圖片是否一致的兩種方法

來源:互聯網
上載者:User

原文 http://blog.csdn.net/summer_dream_journey/article/details/8980312

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

傳統的像素比對方法:

[csharp] view plaincopyprint?
  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.   }  

 

改良後的代碼:

[csharp] view plaincopyprint?
  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.   }  


作者測試了大量圖片,只要改動一個像素點,新方法都可以檢測出不同。不過目前為止還沒有對500*600解析度以上的映像進行測試。

運行大量測試以後,Base64方法的平均測試速度為每對照片0.1s。但是,使用傳統的數組方法快慢則隨圖片而有明顯差別。如果是完全一致的圖片需要平均每對1.8s,檢測出不同則只需要平均每對0.05s。綜合看來新方法在速度上具有優勢。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.