Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SDL_image's IMG_Load do not work

Tags:

sdl-image

I am using IMG_Load() to load png file, but it simply not working. loadedImage = IMG_Load(filename.c_str()); after this sentence, loadedImage is still NULL,not error happened. PS:I am using VS C++2008, png file is in the develop folder. Here is my code:(It is exactly what Lazy Foo like)

//The headers
#include "SDL.h"
#include "SDL_image.h"
#include <string>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//The surfaces
SDL_Surface *image = NULL;
SDL_Surface *screen = NULL;

SDL_Surface *load_image( std::string filename )
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;

    //The optimized image that will be used
    SDL_Surface* optimizedImage = NULL;

    //Load the image using SDL_image
 loadedImage = IMG_Load(filename.c_str());

    //If the image loaded
    if( loadedImage != NULL )
    {
        //Create an optimized image
  //cout<<"Flag";
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //Free the old image
        SDL_FreeSurface( loadedImage );
    }

    //Return the optimized image
    return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
    //Rectangle to hold the offsets
    SDL_Rect offset;

    //Get offsets
    offset.x = x;
    offset.y = y;

    //Blit the surface
    SDL_BlitSurface( source, NULL, destination, &offset );
}

bool init()
{
    //Initialize all SDL subsystems
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return false;
    }

    //Set up the screen
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

    //If there was an error in setting up the screen
    if( screen == NULL )
    {
        return false;
    }

    //Set the window caption
    SDL_WM_SetCaption( "PNG test", NULL );

    //If everything initialized fine
    return true;
}

void clean_up()
{
    //Free the surface
    SDL_FreeSurface( image );

    //Quit SDL
    SDL_Quit();
}

int main( int argc, char* args[] )
{
    //Initialize
    if( init() == false )
    {
        return 1;
    }

    //Load the image
    image = load_image( "look.png" );

    //If there was a problem in loading the image
    if( image == NULL )
    {
        return 5;
    }

    //Apply the surface to the screen
    apply_surface( 0, 0, image, screen );

    //Update the screen
    if( SDL_Flip( screen ) == -1 )
    {
        return 1;
    }

    //Wait 2 seconds
    SDL_Delay( 2000 );

    //Free the surface and quit SDL
    clean_up();


    return 0;
}

The output return 5.

like image 697
Converse Avatar asked Jan 22 '23 06:01

Converse


1 Answers

my bad. I just copy SDL_image.dll to exe floder. I should also copy zlib1.dll and libpng12-0.dll Actually, all the dll is need, because if there is not such dll, the program won't give any error prompt, which is confusing.

like image 140
Converse Avatar answered Mar 29 '23 04:03

Converse