2014-08-29 2 views
0

J'écris un programme qui applique des delta xored à un bitmap existant. Le problème que je vais avoir est-il semble être 5 pixles off dans la première itération conduisant trop des effets de couleurs intéressantesBitmap Scan0, Stride off

private void ApplyDelta(ref Bitmap bitmapA, Bitmap bitmapB, Rectangle bounds) 
    { 
     if (bounds.Width != bitmapB.Width || bounds.Height != bitmapB.Height || bitmapA.PixelFormat != bitmapB.PixelFormat) 
     { 
      return; 
     } 

     BitmapData bmdA = bitmapA.LockBits(bounds, ImageLockMode.ReadWrite, bitmapA.PixelFormat); 
     BitmapData bmdB = bitmapB.LockBits(new Rectangle(0, 0, bitmapB.Width, bitmapB.Height), ImageLockMode.ReadOnly, bitmapB.PixelFormat); 
     unsafe 
     { 
      int bytesPerPixel = Image.GetPixelFormatSize(bitmapA.PixelFormat)/8; 
      for (int y = 0; y < bmdA.Height; y++) 
      { 
       byte* rowA = (byte*)bmdA.Scan0 + (y * bmdA.Stride); 
       byte* rowB = (byte*)bmdB.Scan0 + (y * bmdB.Stride); 
       for (int x = 0; x < bmdA.Width * bytesPerPixel; x++) 
       { 
        rowA[x] ^= rowB[x]; 
       } 
      } 
     } 

     bitmapA.UnlockBits(bmdA); 
     bitmapB.UnlockBits(bmdB); 
    } 

Résultat:

Picture Error

+0

Cela n'a pas de sens de ne pas appliquer * bounds * à bitmapB. –

+0

bitmapB est plus petit que bitmapA, c'est seulement une petite section de bitmap modifié – KevinA

Répondre

1

Le Stride est la largeur d'une ligne de pixels plus une marge de sorte que chaque ligne commence sur une limite de 4 octets pour l'efficacité. De BobPowell.net:

La propriété Stride ... contient la largeur d'une ligne en octets. La taille d'une ligne ne peut cependant pas être un multiple exact de la taille de pixel car, pour plus d'efficacité, le système garantit que les données sont compressées en lignes commençant sur une limite de quatre octets et complétées par un multiple de quatre octets. Cela signifie par exemple qu'une image de 24 bits par pixel de 17 pixels de large aurait une foulée de 52. Les données utilisées dans chaque rangée prendraient 3 * 17 = 51 octets et le remplissage de 1 octet étendrait chaque rangée à 52 octets ou 13 * 4 octets. Une image 4BppIndexed de 17 pixels de large aurait une foulée de 12. Neuf des octets, ou plus exactement huit et demi, contiendraient des données et la ligne serait complétée avec 3 octets supplémentaires à une limite de 4 octets.

Voir this article pour plus d'informations. Edit: Relecture de votre question, je ne suis pas sûr que cela s'applique à votre situation. Mais assurez-vous dans vos calculs que vous gardez le rembourrage à l'esprit.

+0

Il s'avère qu'après quelques recherches, je reçois de mauvais delta bitmap du générateur delta. – KevinA