简体   繁体   English

IMG_Load返回SDL_image错误“​​不支持的图像格式”

[英]IMG_Load returns SDL_image error “unsupported image format”

When I attempt to load a png file, the error "unsupported image format" is returned. 当我尝试加载png文件时,返回错误“不支持的图像格式”。 People have previously posted about this topic on StackOverflow, but none of the solutions have seemed to work for me. 人们之前已经在StackOverflow上发布了关于这个主题的内容,但是这些解决方案似乎都不适用于我。

I am working on a Linux machine, compiling with g++ 我正在使用Linux机器,用g ++编译

Here are my libraries... 这是我的图书馆......

#include <SDL2/SDL.h>
#include <SDL/SDL_image.h>
#include <stdio.h>
#include <string>
#include <zlib.h>
#include <png.h>

And when I compile I include the -lSDL2 and -lSDL_image flags. 当我编译时,我包含-lSDL2和-lSDL_image标志。 I do not use SDL2/SDL_image.h because it is not installed on the machines I am working on. 我不使用SDL2 / SDL_image.h,因为它没有安装在我正在处理的机器上。 Additionally, my png file is definitely in the same directory as my code that tries to load it and I do call IMG_Init(IMG_INIT_PNG) and IMG_INIT_PNG. 另外,我的png文件肯定与尝试加载它的代码位于同一目录中,我调用了IMG_Init(IMG_INIT_PNG)和IMG_INIT_PNG。

Here is my code, the error occurs in the loadSurface function(I believe). 这是我的代码,错误发生在loadSurface函数中(我相信)。

//Using SDL, SDL_image, standard IO, and strings
#include <SDL2/SDL.h>
//#include <SDL/SDL_version.h>
#include <SDL/SDL_image.h>
#include <stdio.h>
#include <string>
#include <zlib.h>
#include <png.h>

//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

//Starts up SDL and creates window
bool init();

//Loads media
bool loadMedia();

//Frees media and shuts down SDL
void close();

//Loads individual image
SDL_Surface* loadSurface( std::string path );

//The window we'll be rendering to
SDL_Window* gWindow = NULL;

//The surface contained by the window
SDL_Surface* gScreenSurface = NULL;

//Current displayed PNG image
SDL_Surface* gPNGSurface = NULL;

bool init()
{
        //Initialization flag
 bool success = true;

        //Initialize SDL
        if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
                printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
                success = false;
        }
        else
        {
                //Create window
                gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
                if( gWindow == NULL )
                {
                        printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
                        success = false;
                }
                else
                {
                        //Initialize PNG loading
                        int imgFlags = IMG_INIT_PNG;
                      if( !( IMG_Init( imgFlags ) & imgFlags ) )
                      {
                              printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() );
                              success = false;
                      }
                      else
                        {
                                //Get window surface
                                gScreenSurface = SDL_GetWindowSurface( gWindow );
                        }
                }
        }

        return success;
}

bool loadMedia()
{
        //Loading success flag
        bool success = true;

        //Load PNG surface
        gPNGSurface = loadSurface( "loaded.png" );
        if( gPNGSurface == NULL )
        {
                printf( "Failed to load PNG image!\n" );
                success = false;
        }

        return success;
}

void close()
{
        //Free loaded image
        SDL_FreeSurface( gPNGSurface );
        gPNGSurface = NULL;

        //Destroy window
        SDL_DestroyWindow( gWindow );
        gWindow = NULL;

        //Quit SDL subsystems
        IMG_Quit();
        SDL_Quit();
}

SDL_Surface* loadSurface( std::string path )
{
        //The final optimized image
        SDL_Surface* optimizedSurface = NULL;
 //Load image at specified path
        SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
        if( loadedSurface == NULL )
        {
                printf( "1Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError() );
        }
        else
        {
                //Convert surface to screen format
                optimizedSurface = SDL_ConvertSurface( loadedSurface, gScreenSurface->format, NULL );
                if( optimizedSurface == NULL )
                {
                        printf( "2Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
                }

                //Get rid of old loaded surface
                SDL_FreeSurface( loadedSurface );
        }

        return optimizedSurface;
}

int main( int argc, char* args[] )
{
        //Start up SDL and create window
        if( !init() )
        {
                printf( "Failed to initialize!\n" );
        }
        else
        {
                //Load media
                if( !loadMedia() )
                {
                        printf( "Failed to load media!\n" );
                }
                else
                {
                       //Main loop flag
                        bool quit = false;

                        //Event handler
                        SDL_Event e;

                        //While application is running
                        while( !quit )
                        {
                                //Handle events on queue
                                while( SDL_PollEvent( &e ) != 0 )
                                {
                                        //User requests quit
                                        if( e.type == SDL_QUIT )
                                        {
                                                quit = true;
                                        }
                                }

                                //Apply the PNG image
                                SDL_BlitSurface( gPNGSurface, NULL, gScreenSurface, NULL );

                                //Update the surface
                                SDL_UpdateWindowSurface( gWindow );
                        }
                }
        }

        //Free resources and close SDL
        close();

        return 0;
}

When I compile, I use g++, compiler flags -w, and linker flags -lSDL2 -lSDL_image 当我编译时,我使用g ++,编译器标志-w和链接器标志-lSDL2 -lSDL_image

When I run, the output is as shows... 当我运行时,输出如下所示......

1Unable to load image loaded.png! 1无法加载image loaded.png! SDL_image Error: Unsupported image format SDL_image错误:不支持的图像格式

Failed to load PNG image! 无法加载PNG图像!

Failed to load media! 无法加载媒体!

编译器标志-lSDL_image应该是-lSDL2_image

First of all, there are few steps when you're compiling your code. 首先,编译代码时几乎没有步骤。 Compilation, linking, and execution. 编译,链接和执行。 If your program gets past first two steps, it's ready to work - to be executed. 如果你的程序超过了前两个步骤,它就可以运行了 - 要执行。 If it passed first two steps, you know that there are no syntax errors or linking errors(eg you passed proper flags to linker). 如果它通过了前两个步骤,您就知道没有语法错误或链接错误(例如,您将适当的标志传递给链接器)。 However, if you receive error on runtime(which is exactly what happened), something is wrong with environment or program logic. 但是,如果您在运行时收到错误(这正是发生的事情),则环境或程序逻辑出现问题。

This said, you didn't provide any code at all, so that's hard to help you. 这就是说,你根本没有提供任何代码,所以很难帮助你。 I'm not sure if you know how to load image at all - you seem to include lots of unnecessary libs for this operations. 我不确定你是否知道如何加载图像 - 你似乎为这个操作包含了许多不必要的库。 I'd recommend you reading this tutorial to learn how to load images with SDL. 我建议您阅读本教程以了解如何使用SDL加载图像。 Probably something is wrong with code(flags, maybe?), but you might as well compiled the code by yourself and be missing some dependencies. 代码可能有问题(标志,可能?),但您可能自己编译代码并缺少某些依赖项。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM