Сканирование растрового изображения0, отключение шага
Я пишу программу, которая применяет xored delta's к существующему растровому изображению. Проблема, с которой я столкнулся, заключается в том, что в первой итерации кажется, что у вас 5 пикселей, что приводит к некоторым интересным цветовым эффектам
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);
}
Результат:
1 ответ
Stride - это ширина одной строки пикселей плюс некоторый отступ, так что каждая строка начинается на 4-байтовой границе для эффективности. От BobPowell.net:
Свойство Stride... содержит ширину одной строки в байтах. Размер строки, однако, может не быть точным кратным размеру пикселя, потому что для эффективности система гарантирует, что данные упакованы в строки, которые начинаются на четырехбайтовой границе и дополняются до кратности четырех байтов. Это означает, например, что изображение размером 24 бита на пиксель шириной 17 пикселей будет иметь шаг 52. Используемые данные в каждой строке будут занимать 3*17 = 51 байт, а заполнение 1 байтом расширит каждую строку до 52 байт или 13*4 байта. Индексированное изображение 4Bpp шириной 17 пикселей будет иметь шаг 12. Девять байтов или, точнее, восемь с половиной, будут содержать данные, и строка будет дополнена дополнительными 3 байтами до границы в 4 байта.
Смотрите эту статью для более подробной информации.
Изменить: Перечитывая ваш вопрос, я не уверен, что это применимо к вашей ситуации. Но убедитесь в своих расчетах, что вы держите в уме отступы.