sto scrivendo un'applicazione SDL/OpenGL che gira sotto OSX. Devo usare il codice esistente che usa la libreria DevIL per caricare le trame JPG e PNG. Sfortunatamente, questo funziona molto male con OS X, quindi ho deciso di non utilizzare affatto DevIL e di riscrivere le rispettive parti dell'applicazione utilizzando un'altra libreria. Voglio mantenerlo flessibile (DevIL può gestire molti formati di immagine) e facile da usare. C'è un buon sostituto per DevIL che puoi raccomandare? L'applicazione è interamente scritta in C++.Come caricare le trame JPG/PNG in un'applicazione SDL/OpenGL in OSX
risposta
Dai un'occhiata alla libreria SDL_image. Offre funzioni come IMG_LoadPNG
che caricano la tua immagine "come" SDL_Surface. Dato che lavori già con SDL, questo dovrebbe adattarsi abbastanza bene al tuo programma.
campione prelevato dal 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";
}
grazie, SDL_image fa la cosa giusta! –
Se sei su Mac OS comunque, perché non usare semplicemente CGImageSource per caricare? OS X supporta in modo nativo il caricamento di molti formati di file, inclusi PNG e JPEG.
Date un'occhiata a freeimage. Supporta tutti i principali formati ed è facilmente costruito con Macport. Bello lavorare anche con Rileva automaticamente formato immagine ecc
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);
Runnable SDL 2 esempio
#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(
COMMON_WINDOW_WIDTH, COMMON_WINDOW_WIDTH,
0, &window, &renderer
);
IMG_Init(IMG_INIT_PNG);
texture = IMG_LoadTexture(renderer, "flower.png");
common_fps_init();
while (1) {
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
common_fps_update_and_print();
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;
}
compilato con:
sudo apt-get install libsdl2-dev libsdl2-image-dev
gcc -std=c99 main.c -lSDL2 -lSDL2_image
su Ubuntu 16.10, SDL 2.0.4.
Downvoters per favore spiega ;-) –
Perché pensi che l'uso di JPEG, PNG, è una buona idea per memorizzare le trame? –
n0rd
Come nondimeno allude a, è necessario solo il supporto per i formati di immagine standard in fase di compilazione. Il processo di compilazione dovrebbe convertire tutte le risorse grafiche in un formato comune. Ciò riduce anche il lavoro che l'app deve eseguire all'avvio, quindi verrà caricata più rapidamente. –
buon punto! probabilmente rimarrò con solo immagini PNG. –