将SDL_Surface像素复制到STL容器中

时间:2012-01-17 22:02:11

标签: c++ sdl pixel-manipulation

我写了这个函数,我想在程序中使用,但出于某种原因,尽管没有出错,它仍然失败:

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获得了正确的像素,无论xy是多少,所以我没看到什么?

1 个答案:

答案 0 :(得分:2)

  

程序在图像中间某处崩溃。

你忘了提及是否崩溃读取或写入内存。您也可以尝试调试它 - 通过VisualStudio / gdb或将yx的值转储到stderr / OutputDebugString

  

grid [y] [x] =(pixels [(image - &gt; 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)

Pixel不保证是32位。此外,如果这不是软件表面,您需要锁定它。请参阅SDL_SurfaceSDL_PixelFormat

的文档