我为C和C ++尝试了许多(超过10个)SDL2示例文件,这些文件加载图像,而任何尝试加载png的文件均失败。
下面的C代码与我发现的代码一样简单,而且注释也很好,并且存在相同的问题。
该代码适用于bmp图片 ,但不适用于 png文件 。 (我正在使用minGW从win7批处理文件进行编译。
此行在使用.png时导致错误,但适用于bmp ...
SDL_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可以动态地找出这一点),但是强烈建议使用它,因为它有助于捕获错误,在这种情况下很有用。因此,我将其保留在此代码清单中。
我不能很快使用论坛,但是四天后我才不知道是什么原因引起的。
感谢所有帮助:)