SDL-доступ к пиксельным данным SDL_Surface - PullRequest
0 голосов
/ 27 ноября 2018

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

Uint32* pixels, oriPixels;
SDL_Surface* image;

void BackupPixelData()
{
    pixels = (Uint32*)image->pixels;
    oriPixels = new Uint32[image->w * image->h];
    for (int i = 0; i < image->w * image->h; i++)
    {
        oriPixels[i] = pixels[i]; //This causes an access violation midway through
        *(oriPixels + i) = *(pixels + i); //Using this method does not cause any crash, but the image will have artifacts
    }
}

Я могу заставить код работать, изменив oriPixels на вектор Uint32, и у меня не возникло никаких проблем, связанных с этим (изображение может быть восстановлено висходный цвет с использованием oriPixels).

Что нужно сделать, чтобы правильно загрузить данные пикселей?

Изображение в 32-битном формате.

1 Ответ

0 голосов
/ 27 ноября 2018

Необходимо учитывать выравнивание данных.Строки могут быть дополнены в зависимости от формата поверхности.Проверьте документацию о поле высоты тона SDL_Surface для получения более подробной информации https://wiki.libsdl.org/SDL_Surface.

Вы получаете нарушение прав доступа, потому что размер буфера памяти не ширина * высота, а фактически высота * высота *. 1004 *

...