SDL 表面像素格式转换

Posted

技术标签:

【中文标题】SDL 表面像素格式转换【英文标题】:SDL Surface Pixel Format Conversion 【发布时间】:2010-12-02 21:40:33 【问题描述】:

我想将由 IMG_Load() 加载的 SDL_Surface 转换为 OpenGL 纹理的其他像素格式 (rgba8)。我怎样才能做到这一点? 我在文档中阅读了有关 SDL_ConvertSurface() 的信息,但我不知道如何将它组合在一起。

【问题讨论】:

您真的需要将其转换为 RGBA,还是只需将其加载到纹理中? 【参考方案1】:

给"How To Load an OpenGL Texture from an SDL_Surface"一个机会:

GLuint texture;         // This is a handle to our texture object
SDL_Surface *surface;   // This surface will tell us the details of the image
GLenum texture_format;
GLint  nOfColors;

if( (surface = SDL_LoadBMP("image.bmp")) )
 
    // Check that the image's width is a power of 2
    if( (surface->w & (surface->w - 1)) != 0 )
    
        printf("warning: image.bmp's width is not a power of 2\n");
    

    // Also check if the height is a power of 2
    if( (surface->h & (surface->h - 1)) != 0 )
    
        printf("warning: image.bmp's height is not a power of 2\n");
    

    // get the number of channels in the SDL surface
    nOfColors = surface->format->BytesPerPixel;
    if( nOfColors == 4 )     // contains an alpha channel
    
        if(surface->format->Rmask == 0x000000ff)
            texture_format = GL_RGBA;
        else
            texture_format = GL_BGRA;
    
    else if( nOfColors == 3 )     // no alpha channel
    
        if(surface->format->Rmask == 0x000000ff)
            texture_format = GL_RGB;
        else
            texture_format = GL_BGR;
    
    else
    
        printf("warning: the image is not truecolor..  this will probably break\n");
        // this error should not go unhandled
    

    // Have OpenGL generate a texture object handle for us
    glGenTextures( 1, &texture );

    // Bind the texture object
    glBindTexture( GL_TEXTURE_2D, texture );

    // Set the texture's stretching properties
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

    // Edit the texture object's image data using the information SDL_Surface gives us
    glTexImage2D
        (
        GL_TEXTURE_2D,
        0,
        nOfColors,
        surface->w,
        surface->h,
        0,
        texture_format,
        GL_UNSIGNED_BYTE,
        surface->pixels
        );
 
else

    printf("SDL could not load image.bmp: %s\n", SDL_GetError());
    SDL_Quit();
    return 1;
    

// Free the SDL_Surface only if it was successfully created
if( surface )
 
    SDL_FreeSurface( surface );

【讨论】:

以上是关于SDL 表面像素格式转换的主要内容,如果未能解决你的问题,请参考以下文章

将 SDL 表面转换为 GL 纹理时出现问题

ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战

YUYV格式到RGB格式的转换

基于FFmpeg的视频播放器之五:使用SDL2渲染yuv420p

纹理的 SDL 渲染器参数,但表面不需要

从 24bpp 位图中获取每个像素的 RGB 值,以便在 C 中转换为 GBA 格式