在C#中快速比對圖片的新方法

來源:互聯網
上載者:User

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: }

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

下面兩個映像經測試返回true(映像完全一致)(不通過判斷檔案名稱):

dom1

dom2

相比之下兩張明顯不同的圖片則判斷為false(圖片不同)。

dom1

dom3

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

 

 

源自:http://cnbeta.com/articles/92796.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.