2014-08-29 3 views
0

Я пишу программу, которая применяет xored delta к существующему растровому изображению. Проблема у меня в том, что, кажется, 5 pixles прочь в первой итерации, ведущие слишком интересные цветовые эффектыBitmap 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); 
    } 

Результат:

Picture Error

+0

Не имеет смысла не применять также * границы * к bitmapB. –

+0

bitmapB меньше, чем bitmapA, это всего лишь небольшая часть измененного растрового изображения – KevinA

ответ

1

Stride ширина одной строки пикселей плюс некоторое заполнение, так что каждая строка начинается с границы 4 байта для эффективности. От BobPowell.net:

Свойство Stride ... содержит ширину одной строки в байтах. Размер строки, однако, не может быть точным кратным размеру пикселя, потому что для эффективности система гарантирует, что данные будут упакованы в строки, которые начинаются с границы четырех байтов и дополняются до четырех байтов. Это означает, например, что 24-битное изображение на пиксель шириной 17 пикселей будет иметь шаг 52. Используемые данные в каждой строке занимают 3 * 17 = 51 байт, а заполнение 1 байт будет расширять каждую строку до 52 байтов или 13 * 4 байта. 4BppIndexed изображение шириной 17 пикселей будет иметь шаг 12. Девять из байтов, или, более правильно, восемь с половиной, будут содержать данные, а строка будет дополнена дополнительными 3 байтами к границе 4 байта.

Для получения более подробной информации см. this article.

Редактировать: Повторное чтение вашего вопроса, я не уверен, что это применимо к вашей ситуации. Но убедитесь, что в ваших расчетах вы сохраняете прописку.

+0

Оказывается, после некоторого расследования я получаю плохие растровые дельта от дельта-генератора. – KevinA