Сканирование растрового изображения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 байта.

Смотрите эту статью для более подробной информации.

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

Другие вопросы по тегам