Ошибка C IMG_Load (): Неподдерживаемый формат изображения

#c #sdl #sdl-image

Вопрос:

Вещи, которые я пробовал:

  • Переустановка libpng и zlib
  • Переустановка SDL_image-dev и всех других библиотек SDL2
  • Повторный импорт библиотеки SDL_image.a
  • Изменил все параметры компоновщика и по-прежнему ничего
  • Изменил каталоги поиска

Ничего не получалось, я все еще здесь, выясняю это…

Код настроек компоновщика::Блоки

 -lSDL2 -lSDL2main -lSDL2_image
Link Libraries: /usr/local/lib/libSDL2_image.a /usr/local/lib/libBox2D.a
Search Directories: /usr/include/SDL2
 

Фрагмент кода, который выдает мне ошибку:

     int flags1=IMG_INIT_JPG|IMG_INIT_PNG;
    int initted=IMG_Init(flags1);
    if((inittedamp;flags1) != flags1) {
         printf("IMG_Init: Failed to init required jpg and png support!n");
         printf("IMG_Init: %sn", IMG_GetError());
         // handle error
}

//SDL_Surface* tmpSurface = SDL_LoadBMP("ball.bmp");
SDL_Surface* tmpSurface = IMG_Load("ball.png");
std::cout<<IMG_GetError()<<"n";
std::cout<<"Errors above for image"<<"n";
ballspr = SDL_CreateTextureFromSurface(renderer,tmpSurface);
SDL_FreeSurface(tmpSurface);
 

Полный код Game.cpp:

 #include "Game.hpp"

SDL_Texture* ballspr;

Game::Game()
{}
Game::~Game()
{}

void Game::init(const char *title, int xpos, int ypos,int width, int height, bool fullscreen)
{
    if(SDL_Init(SDL_INIT_EVERYTHING) == 0)
    {
        int flags=0;
        if(fullscreen)
        {
            flags = SDL_WINDOW_FULLSCREEN;
        }

        std::cout<<"SDL2 Lib initialised correctly...n";

        window = SDL_CreateWindow(title,xpos,ypos,width,height,flags);


        if(window)
        {
            std::cout<<"SDL Window initialised correctly...n";
        }

        renderer = SDL_CreateRenderer(window,-1,0);
        if(renderer)
        {
            SDL_SetRenderDrawColor(renderer, 36,36,36,255);
            std::cout<<"SDL Renderer initialized correctly...n";
        }

 int flags1=IMG_INIT_JPG|IMG_INIT_PNG;
 int initted=IMG_Init(flags1);
 if((inittedamp;flags1) != flags1) {
     printf("IMG_Init: Failed to init required jpg and png support!n");
     printf("IMG_Init: %sn", IMG_GetError());
     // handle error
    }
//SDL_Surface* tmpSurface = SDL_LoadBMP("ball.bmp");
SDL_Surface* tmpSurface = IMG_Load("ball.png");
std::cout<<IMG_GetError()<<"n";
std::cout<<"Errors above for image"<<"n";
ballspr = SDL_CreateTextureFromSurface(renderer,tmpSurface);
SDL_FreeSurface(tmpSurface);

        isRunning=true;
    } else {
        isRunning=false;
    }
}

void Game::handleEvent()
{
    SDL_Event event;
    SDL_PollEvent(amp;event);
    switch(event.type) {
        case SDL_QUIT:
            isRunning = false;
            break;

        default:
            break;
    }
}

void Game::update()
{}

void Game::render()
{
    SDL_Rect rect;
    rect.x = 100; //Extreme left of the window
    rect.y = 100; //Very bottom of the window
    rect.w = 100; //100 pixels width
    rect.h = 100; //100 pixels height
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, ballspr, NULL, amp;rect);
    SDL_RenderPresent(renderer);
}

void Game::clean()
{
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();
    std::cout << "Game Cleaned!n";
}
 

Full code of Game.hpp

 #ifndef Game_hpp
#define Game_hpp

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
//#include <Box2D/Box2D.h>

class Game
{
public:
    Game();
    ~Game();

    void init(const char *title, int xpos, int ypos, int width, int height, bool fullscreen);
    void handleEvent(); // handle all the events like movement and so on
    void update(); // update screen
    void render(); // render scene
    void clean();

    bool running() { return isRunning; } // Is game running?
private:
    bool isRunning;
    SDL_Window *window;
    SDL_Renderer *renderer;
};

#endif /* Game_hpp */
 

Полный код Main.cpp

 #include "Game.hpp"

Game *game = nullptr;

int main(int argc, char *argv[]){ //Setting up main game function
    game = new Game();
    game->init("MazeGame (powered by NeedleEngine 2D)", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 500 , 500, false);
    while (game->running())
    {
        game->handleEvent();
        game->update();
        game->render();
    }

    game->clean();
    return 0; //Exit main()
}
 

Я попытался удалить SDL2/ в include, но все равно ничего.
В настоящее время работает последняя версия Linux Mint

Комментарии:

1. В каком каталоге вы запускаете программу ? Есть ball.png в этом каталоге ? Допустимо ли изображение, например, является ли оно png ?

2. Итак, проверка гласит: Не удалось инициализировать требуемую поддержку png и jpg. Изображения в формате PNG не поддерживаются. Проблема остается той же самой, хотя.

3. Почему бы не попробовать другие форматы, такие как jpg, gif или даже bmp ?

4. Импорт bmp по умолчанию работает,но мне нужна прозрачность, так как на заднем плане будет шарик. По-прежнему jpg не работает

5. Вероятно, вам необходимо установить библиотеку PNG dev перед настройкой библиотеки изображений SDL и ее переустановкой