Копирование пикселей SDL_Surface в контейнер STL - PullRequest
0 голосов
/ 18 января 2012

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

std::deque <std::deque <bool> > load_image(std::string & image_name){
    SDL_Surface * image = open_image(image_name);
    if (!image)
        exit(3);
    Uint32 * pixels = (Uint32 *) image -> pixels;
    std::deque <std::deque <bool> > grid(HEIGHT, std::deque <bool>(WIDTH, false));
    for(int y = 0; y < std::min(image -> h, HEIGHT); y++)
        for(int x = 0; x < std::min(image -> w, WIDTH); x++)
            grid[y][x] = (pixels[(image -> w * y) + x] == 0);
    SDL_FreeSurface(image);
    return grid;
}

Я просто пытаюсь скопировать, является ли пиксельчерный в grid.Когда я запускаю grid[y][x] и (pixels[(image -> w * y) + x] == 0) отдельно, программа работает нормально.Когда я делаю grid[y][x] = (pixels[(image -> w * y) + x] == 0);, программа падает где-то посередине изображения.

Я уверен, что (image -> w * y) + x получает правильный пиксель, независимо от того, чем ограничены x и y, так что я не вижу ??

1 Ответ

2 голосов
/ 18 января 2012

программа вылетает где-то посередине изображения.

Вы забыли упомянуть, происходит ли сбой чтения или записи памяти. Также вы можете попробовать отладить его - либо через VisualStudio / gdb, либо сбросив значения y и x в stderr / OutputDebugString.

grid [y] [x] = (пиксели [(изображение -> w * y) + x] == 0);

Неа.

Для решения проблемы использования одного пикселя:

&((const char*)image->pixels)[y * image->pitch + x*image->format->BytesPerPixel];

или

(const Uint32*)((const char*)image->pixels + y * image->pitch + x*image->format->BytesPerPixel)

Пиксель не гарантированно будет 32-битным. Кроме того, если это не программная поверхность, вам необходимо заблокировать ее. См. Документацию для SDL_Surface и SDL_PixelFormat

...