无法使用 IMG_Load() 加载图像
Posted
技术标签:
【中文标题】无法使用 IMG_Load() 加载图像【英文标题】:Can't load image with IMG_Load() 【发布时间】:2014-04-27 12:33:26 【问题描述】:我的 SDL_image 库有问题。我写了一个简单的程序加载一个精灵表并在左键单击时对其进行动画处理。代码如下:
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
const int sw=800;
const int sh=450;
int main()
SDL_Init(SDL_INIT_EVERYTHING);
IMG_Init(IMG_INIT_PNG);
bool quit=false;
bool shoot=false;
SDL_Event event;
Uint32 time;
unsigned char frame=0;
SDL_Window* window = SDL_CreateWindow("Sprite",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,sw,sh,0);
SDL_Renderer* render = SDL_CreateRenderer(window,-1,0);
SDL_Surface* image = IMG_Load("p_pt_12.png");
printf("IMG_Load: %s\n", IMG_GetError());
SDL_Texture* texture = SDL_CreateTextureFromSurface(render, image);
while(!quit)
if(shoot)
time=SDL_GetTicks();
time/=(750/5);
frame=time%5;
if(frame==4)
frame = 0;
shoot=false;
SDL_Rect srcrect = frame*96,0,96,96;
SDL_Rect dstrect = (sw-96)/2, (sh-96)/2, 96, 96 ;
SDL_PollEvent(&event);
switch (event.type)
case SDL_QUIT:
quit = true;
break;
case SDL_MOUSEBUTTONDOWN:
if(event.button.button == SDL_BUTTON_LEFT) shoot = true;
break;
SDL_RenderClear(render);
SDL_RenderCopy(render, texture,&srcrect,&dstrect);
SDL_RenderPresent(render);
SDL_DestroyTexture(texture);
SDL_FreeSurface(image);
SDL_DestroyRenderer(render);
SDL_DestroyWindow(window);
IMG_Quit();
SDL_Quit();
return 0;
问题是当我尝试运行它时,IMG_Load() 返回 NULL 指针并且 IMG_GetError() 显示“不支持的文件格式”。 spritesheet 是一个 .png 文件,但 .jpg spritesheet 也是如此。我敢肯定,代码是正确的,因为它可以在具有完全相同图像文件的其他设备上运行,就像魅力一样。我试过重新安装 SDL 和 SDL_image,但它不起作用。 SDL_RWops 和 IMG_LoadPNG_RW 也无济于事。我在 64 位 Linux Mint 上使用 Eclipse Kepler SR2(但我也尝试使用 Code::Blocks 12.11 运行它,结果相同)。
我将不胜感激任何形式的帮助,谢谢!
【问题讨论】:
【参考方案1】:您的代码是正确的并且对我有用。可能您的系统缺少 sdl_image 处理图像所需的一些库,例如 libpng 和 zlib。安装它们并让我们知道它是否有效。
【讨论】:
我已经通过包管理器安装了 SDL_image,所以 libpng 和 zlib 是自动安装的。 大部分错误是由于缺少 libpng 和 zlib 引起的,请尝试将它们包含为 png.h 和 zlib.h。 也试过了,没有效果。 这很奇怪。仅当其他人尝试在没有所需库的情况下编译我的一些代码或图像不在工作目录中时(也检查一下,特别是如果您在项目树中的 IDE 中启动程序,尝试启动来自同一目录中的终端),所以这次我不确定。尝试使用 -ggdb 编译并运行 valgrind 以查看错误在哪里。我有兴趣解决这个问题,作为一名 SDL/OpenGL 开发人员,我不希望这种情况发生,所以如果您能提供更多信息并进行更多测试,这将对双方都有帮助。 和我想的一样,链接 SDL2_image 而不是 SDL_image。以上是关于无法使用 IMG_Load() 加载图像的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 loadImageWithCompletionHandler 加载 GKAchievementDescription 图像
无法使用 BitmapFactory.decodeFile 加载 JPEG 图像。返回空
无法使用 GatsbyJS 从 Contentful 加载图像