Я перепробовал много (более 10) примеров файлов SDL2 для C & C ++, которые загружают образы, и любой, который пытается загрузить png, терпит неудачу.
Приведенный ниже код C примерно настолько же прост и хорошо прокомментирован, насколько я могу найти, и у него та же проблема.
Код отлично работает с изображениями bmp , но не будет работать для png файла .(Я компилирую из командного файла win7, используя minGW.
Эта строка вызывает ошибку при использовании .png, но работает для bmp ...
SDL_Surface * surface = IMG_Load ("smile.bmp");
Полный список кодов
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
int main(int argc, char* args[])
{
// attempt to initialize graphics and timer system
if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
printf("error initializing SDL: %s\n", SDL_GetError());
getchar(); // show error message, hit any key to quit
return 1; // return error value
}
// load support for the JPG and PNG image formats
int flags=IMG_INIT_JPG|IMG_INIT_PNG;
int initted=IMG_Init(flags);
if((initted&flags) != flags) {
printf("IMG_Init: Failed to init required jpg and png support!\n");
printf("IMG_Init: %s\n", IMG_GetError());
// handle error
}
SDL_Window* win = SDL_CreateWindow("SDL2 image library test",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
400, 400, 0);
if (!win)
{
printf("error creating window: %s\n", SDL_GetError());
getchar(); // show error message, hit any key to quit
SDL_Quit();
return 1; // return error value
}
// print video card drivers
SDL_RendererInfo info;
int cnt, iDrivers;
iDrivers = SDL_GetNumRenderDrivers();
while ( cnt < iDrivers )
{
if ( SDL_GetRenderDriverInfo(cnt,&info) == 0 )
{
printf("%s\n",info.name);
}
cnt++;
}
// create a renderer, which sets up the graphics hardware
Uint32 render_flags = SDL_RENDERER_PRESENTVSYNC | IMG_INIT_JPG | IMG_INIT_PNG;
SDL_Renderer* rend = SDL_CreateRenderer(win, -1, render_flags);
if (!rend)
{
printf("error creating renderer: %s\n", IMG_GetError());
getchar(); // show error message, hit any key to quit
SDL_DestroyWindow(win);
SDL_Quit();
return 1; // return error value
}
// load the image into ram memory using SDL_image library function
SDL_Surface* surface = IMG_Load("smile.png");
if (!surface)
{
printf("error creating surface: %s \n", SDL_GetError());
getchar(); // show error message, hit any key to quit
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 1; // return error value
}
// load the image data into the graphics hardware's memory
SDL_Texture* tex = SDL_CreateTextureFromSurface(rend, surface);
SDL_FreeSurface(surface);
if (!tex)
{
printf("error creating texture: %s\n", SDL_GetError());
getchar(); // show error message, hit any key to quit
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
SDL_RenderClear(rend); // clear the window
SDL_RenderCopy(rend, tex, NULL, NULL); // draw the image to the window
SDL_RenderPresent(rend);
SDL_Delay(10000); // pause 10 seconds before quitting
SDL_DestroyTexture(tex); // clean up resources before exiting
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 0; // return success value
}
ОБНОВЛЕНИЕ
[решено] С помощью многих участников, приведенных ниже, я смог в конечном итоге почувствовать уверенность вПрограмма была правильной, и у меня была какая-то проблема с установкой. После хорошего ночного сна я скачал и перезагрузил mingw, SDL2_image и zlib , убедившись, что я использовал 64-битные версии. Я рад сообщить, что проблема исчезла.
Чтобы помочь кому-либо в будущем, код инициализации
int flags=IMG_INIT_JPG|IMG_INIT_PNG;
int initted=IMG_Init(flags);
рекомендуется «Roger Rapid & Keltar» не является абсолютно необходимым (SDL2 может понять это динамически), но иметь его настоятельно рекомендуется, потому что это помогает отлавливать ошибки, что было полезно в этом случае. По этой причине я оставил его в этом коделистинг.
Iя не быстро пользуюсь форумами, но через 4 дня у меня просто не было подсказки, что может быть причиной проблемы.
Спасибо за помощь:)