2009-03-16 6 views
3

Я хочу сравнить два файла bmp. Я подумал о двух подходах:Сравнение файлов BMP?

  1. для сравнения заголовка, а также информации заголовка из двух файлов
  2. преобразующих .bmp файл в двоичный, а затем сделать приведенное выше сравнение

Но, не знаю, с чего начать, и который будет лучшим подходом. Я был бы рад, если бы кто-то мог мне помочь!

+0

Какое сравнение вы делаете? Вы хотите проверить, являются ли они идентичными копиями? или вы хотите проверить, являются ли они похожими изображениями? Первый из них прост в использовании, а второй - немного сложнее. – Niyaz

ответ

1

Я не знаю, на какой платформе вы хотите реализовать это, но вот некоторые фрагменты кода, которые могут быть полезны:

Compare two images with C#

Это фрагмент сравнить 2 изображения в посмотрите, совпадают ли они. Этот метод сначала преобразует каждый битмап в массив байтов , затем получает хэш каждого массива . Затем мы прокручиваем каждый в хэш, чтобы увидеть, совпадают ли они.

/// <summary> 
/// method for comparing 2 images to see if they are the same. First 
/// we convert both images to a byte array, we then get their hash (their 
/// hash should match if the images are the same), we then loop through 
/// each item in the hash comparing with the 2nd Bitmap 
/// </summary> 
/// <param name="bmp1"></param> 
/// <param name="bmp2"></param> 
/// <returns></returns> 
public bool doImagesMatch(ref Bitmap bmp1, ref Bitmap bmp2) 
{ 
    ... 
} 
0

Ну, у вас есть по крайней мере два варианта здесь:

  • Изображения в основном те же
    В этом случае я бы рекомендовал сравнить с использованием раствора splattne в

  • Изображения, как правило, разные, и только иногда такие же
    В этом случае может случиться так, что вы можете отклонить любое сходство между двумя изображениями при быстром сравнении заголовка информации (думаете, что размер такой же?), И только выполнить полное сравнение, если информация неоднозначна (т.е. размер является то же самое)

0

Вы можете использовать метод расширения в .NET 3.0+ для этого, чтобы выставить метод сравнения по всем Bitmaps:

public static bool Compare(this Bitmap bmp1, Bitmap bmp2) 
    { 
     //put your comparison logic here 
    } 
0

Что вы сравнение для? Вы хотите посмотреть, не совпадают ли 2 изображения? Или вам нужна разница? Для точных совпадений, как создавать и сравнивать хэши обоих файлов?

0

Вышеупомянутые решения не сработали для меня, когда у меня было два изображения, которые отличались только глубиной цвета: один был 32bpp, а другой был 8bpp. Решение, к которому я пришел, использовал LockBits для преобразования всех изображений в 32bpp, Marshal.Copy(), чтобы получить данные в массиве, а затем просто сравнить массивы.

/// <summary> 
/// Compares two images for pixel equality 
/// </summary> 
/// <param name="fname1">first image file</param> 
/// <param name="fname2">second image file</param> 
/// <returns>true if images are identical</returns> 
public static string PageCompare(string fname1, string fname2) { 
    try { 
     using (Bitmap bmp1 = new Bitmap(fname1)) 
     using (Bitmap bmp2 = new Bitmap(fname2)) { 
      if (bmp1.Height != bmp2.Height || bmp1.Width != bmp2.Width) 
       return false; 

      // Convert image to int32 array with each int being one pixel 
      int cnt = bmp1.Width * bmp1.Height * 4/4; 
      BitmapData bmData1 = bmp1.LockBits(new Rectangle(0, 0, bmp1.Width, bmp1.Height), 
       ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
      BitmapData bmData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), 
       ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 

      Int32[] rgbValues1 = new Int32[cnt]; 
      Int32[] rgbValues2 = new Int32[cnt]; 

      // Copy the ARGB values into the array. 
      System.Runtime.InteropServices.Marshal.Copy(bmData1.Scan0, rgbValues1, 0, cnt); 
      System.Runtime.InteropServices.Marshal.Copy(bmData2.Scan0, rgbValues2, 0, cnt); 

      bmp1.UnlockBits(bmData1); 
      bmp2.UnlockBits(bmData2); 
      for (int i = 0; i < cnt; ++i) { 
       if (rgbValues1[i] != rgbValues2[i]) 
        return false; 
      } 
     } 
    } 
    catch (Exception ex) { 
     return false; 
    } 
    // We made it this far so the images must match 
    return true; 
}