2013-04-09 3 views
2

J'écris une fonction pour obtenir la différence entre deux images bitmap dans Visual Studio 2010. J'ai une fonction qui prend deux images bitmap comme paramètres, j'utilise des bits de déverrouillage pour obtenir des données de chaque pixel, les deux images sont de résolution et de dimensions égales.Comparer deux données d'image en utilisant la méthode dangereuse

Lorsque j'utilise des bits déverrouillage pour une seule image, il fonctionne bien, mais quand je l'utilise pour les deux simultanément dans la même fonction lui donne une exception

REGION BITMAP EST DÉJÀ BLOQUE

Code:

public Bitmap Invert(Bitmap b,Bitmap c) 
    { 

     BitmapData bmData = 
      b.LockBits(new System.Drawing.Rectangle(0, 0, b.Width, b.Height), 
         ImageLockMode.ReadWrite, 
         System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

     int stride = bmData.Stride; 
     System.IntPtr Scan0 = bmData.Scan0; 

     // for image 2 
     BitmapData data2 = 
      c.LockBits(new System.Drawing.Rectangle(0, 
                0, 
                c.Width, 
                c.Height), 
         ImageLockMode.ReadWrite, 
         System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

     int stride1 = data2.Stride; 
     System.IntPtr Scan1 = data2.Scan0; 
     unsafe 
     { 
      byte* p = (byte*)(void*)Scan0; 
      byte* q = (byte*)(void*)Scan1; 
      nOffset = stride - b.Width * 3; 
      nWidth = b.Width * 3; 
      for (y = 0; y < b.Height; ++y) 
      { 
       for (x = 0; x < nWidth; ++x) 
       { 
        p[0] = (byte)(p[0]-q[0]); 
        ++p; 
        ++q; 
       } 
       p += nOffset; 
       q += nOffset; 
      } 
     } 

     b.UnlockBits(bmData); 
     c.UnlockBits(data2); 
     return b; 
    } 
+0

Où se bloque-t-il? –

+0

WPF? Pourquoi ne pas utiliser "WriteableBitmap' au lieu des types' System.Drawing'? –

+1

Dites-nous quel est le résultat de 'object.ReferenceEquals (b, c)' au début de la méthode. –

Répondre

0

Becuase il vous suffit de comparer les images, je suggesst ouverte en les lisant uniquement en mode lecture i.e:

BitmapData data2 = c.LockBits(new System.Drawing.Rectangle(0, 
               0, 
               c.Width, 
               c.Height), 
        ImageLockMode.ReadOnly, 
        System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
Questions connexes