Ошибка памяти при доступе к пиксельным данным с использованием LockBits

Я получаю эту ошибку при использовании приведенного ниже кода для доступа к данным пикселей трех разных растровых изображений:

Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.

Код C#:

var bmpDataA = bitmap.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
var bmpDataB = bitmap2.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
var bmpDataC = bitmap3.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

const int width = 1280;
const int height = 720;
int npixels = width * height;

unsafe
{
    int* pPixelsA = (int*)bmpDataA.Scan0.ToPointer();
    int* pPixelsB = (int*)bmpDataB.Scan0.ToPointer();
    int* pPixelsC = (int*)bmpDataC.Scan0.ToPointer();

    for (int i = 0; i < npixels; ++i)
    {
        if (pPixelsA[i] == pPixelsB[i]) // <--- Error occurs on this line
        {
            pPixelsC[i] = Color.Black.ToArgb();
        }
    }
}
bitmap.UnlockBits(bmpDataA);
bitmap2.UnlockBits(bmpDataB);
bitmap3.UnlockBits(bmpDataC);

Используя отладчик, я вижу, что переменная npixels = 921600 и когда происходит ошибка, переменная (для цикла) i = 691200. Так что не уверен, в чем проблема. Если я изменю формат пикселя на 32bppRgb, проблем не будет, и он будет работать нормально. Просто не хочет работать с 24bppRgb. Есть идеи? Благодарю.:)

1 ответ

Решение
  1. PixelFormat.Format24bppRgb означает 24 бита = 3 байта на каждый пиксель, поэтому метод LockBits блокирует 1280 * 720 * 3 = 2764800 байт.

  2. Вы указываете на заблокированные данные на int *. Размер int = 32 бита = 4 байта.

  3. Поэтому вы пытаетесь обработать 1280 * 720 * 4 = 3686400 байт, в то время как у вас есть блокировка 2764800 (см. 1). Несоответствие.

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