代码之家  ›  专栏  ›  技术社区  ›  Patrick Oscity

如何在OSX下的SDL/OpenGL应用程序中加载JPG/PNG纹理

  •  6
  • Patrick Oscity  · 技术社区  · 14 年前

    我正在编写一个在OSX下运行的SDL/OpenGL应用程序。我必须使用现有的代码,使用魔鬼库加载JPG和PNG纹理。不幸的是,这在OSX下非常糟糕,所以我决定根本不使用DevIL,而是使用另一个库重写应用程序的各个部分。我想保持它的灵活性(魔鬼可以处理大量的图像格式)和易于使用。你能推荐一个好的恶魔替代品吗?应用程序完全是用C++编写的。

    4 回复  |  直到 8 年前
        1
  •  10
  •   lx.    7 年前

    看看 SDL_image 图书馆。它提供如下功能 IMG_LoadPNG 既然你已经和SDL一起工作了,这应该很适合你的程序。

    样品取自 SDL_image documentation :

    // Load sample.png into image
    SDL_Surface* image = IMG_Load("sample.png");
    if (image == nullptr) {
        std::cout << "IMG_Load: " << IMG_GetError() << "\n";
    }
    
        2
  •  2
  •   Ciro Santilli OurBigBook.com    5 年前

    SDL 2 SDL_映像最小可运行示例

    主c

    #include <stdlib.h>
    
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_image.h>
    
    int main(void) {
        SDL_Event event;
        SDL_Renderer *renderer = NULL;
        SDL_Texture *texture = NULL;
        SDL_Window *window = NULL;
    
        SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
        SDL_CreateWindowAndRenderer(
            500, 500,
            0, &window, &renderer
        );
        IMG_Init(IMG_INIT_PNG);
        texture = IMG_LoadTexture(renderer, "flower.png");
        while (1) {
            SDL_RenderCopy(renderer, texture, NULL, NULL);
            SDL_RenderPresent(renderer);
            if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
                break;
        }
        SDL_DestroyTexture(texture);
        IMG_Quit();
        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    

    GitHub upstream

    编译并运行:

    sudo apt-get install libsdl2-dev libsdl2-image-dev
    gcc -std=c99 -o main -Wall -Wextra -pedantic main.c -lSDL2 -lSDL2_image
    ./main
    

    结果:

    enter image description here

        3
  •  1
  •   uggwar    14 年前

    看一看 freeimage . 它支持所有主要格式,并且很容易用macports构建。很高兴和你一起工作。自动检测图像格式等。

    FREE_IMAGE_FORMAT format = FreeImage_GetFileType(filename.c_str(), 0);
    FIBITMAP *bitmap = FreeImage_Load(format, filename.c_str());
    if (!bitmap)
    {
        LOG_ERROR("Unable to load texture: " + filename);
        return false;
    }
    mlWidth = FreeImage_GetWidth(bitmap);
    mlHeight = FreeImage_GetHeight(bitmap);
    glGenTextures(1, &mpTextures[0]);
    glBindTexture(GL_TEXTURE_2D, mpTextures[0]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mlWidth, mlHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE,
           (GLvoid*)FreeImage_GetBits(bitmap));
    FreeImage_Unload(bitmap);
    
        4
  •  0
  •   Chris Becke    14 年前

    CGImageSource 去装货?OSX本机支持加载许多文件格式,包括PNG和JPEG。