2009-03-16 5 views
3

Je veux comparer deux fichiers bmp. Je pensais à deux approches:La comparaison des fichiers bmp?

  1. à comparer l'en-tête ainsi que l'en-tête d'information des deux fichiers
  2. convertir le fichier bmp en binaire, puis faire la comparaison ci-dessus

Mais, je Je ne sais pas comment commencer et quelle sera la meilleure approche. Je serais heureux si quelqu'un pourrait m'aider s'il vous plaît!

+0

Quel type de comparaison que vous faites? Voulez-vous vérifier s'il s'agit de copies identiques? ou voulez-vous vérifier si ce sont des images similaires? Le premier est simple à faire et le second est un peu plus compliqué. – Niyaz

Répondre

1

Je ne sais pas sur quelle plate-forme que vous voulez mettre en œuvre, mais voici quelques extraits de code qui pourraient être utiles:

Compare two images with C#

C'est un extrait de comparer 2 images à voir s'ils sont identiques. Cette méthode convertit d'abord chaque bitmap en un tableau d'octets , puis obtient le hachage de chaque tableau . Nous parcourons ensuite chacun d'eux en le hachage pour voir s'ils correspondent.

/// <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

Eh bien, vous avez au moins deux options:

  • Les images sont essentiellement les mêmes
    Dans ce cas, je vous recommande un comparer en utilisant la solution de splattne

  • Les images sont généralement différentes, et parfois seulement les mêmes
    Dans ce cas, il se peut que vous puissiez ignorer toute similitude entre les deux images avec une comparaison rapide de l'en-tête d'information (pensez que la taille est la même?) Et ne faites la comparaison complète que si l'information est ambigu (c'est à dire la taille est même)

0

Vous voudrez peut-être utiliser une méthode d'extension .NET 3.0+ pour cela exposer la méthode comparer sur tous les bitmaps:

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

Que faites-vous comparer pour? Cherchez-vous à voir si 2 images sont exactement les mêmes? Ou avez-vous besoin de degrés de différence? Pour les correspondances exactes, comment créer et comparer les hachages des deux fichiers?

0

Les solutions ci-dessus ne fonctionnaient pas pour moi quand j'avais deux images qui ne différaient que par la profondeur de couleur - l'une était de 32bpp et l'autre de 8bpp. La solution que je suis arrivé à utilisé LockBits pour convertir toutes les images en 32bpp, Marshal.Copy() pour obtenir les données dans un tableau, puis juste comparer les tableaux.

/// <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; 
} 
Questions connexes