IMG_Load de SDL_image no hacer el trabajo
-
08-10-2019 - |
Pregunta
Estoy utilizando IMG_Load () para la carga de archivos PNG, pero simplemente no funciona. loadedImage = IMG_Load (filename.c_str ()); después de esta frase, loadedImage sigue siendo NULL, no ocurrió el error. PS: Estoy utilizando VS C ++ 2008, archivo PNG se encuentra en la carpeta de desarrollarse. Aquí está mi código: (Es exactamente lo Lazy Foo similares)
//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;
}
El retorno de salida 5.
Solución
mi mal. Puedo copiar SDL_image.dll a exe Floder. También debería copiar zlib1.dll y libpng12-0.dll En realidad, toda la DLL es necesario, porque si no hay tales DLL, el programa no se dará por cualquier error del sistema, lo cual es confuso.
Otros consejos
Si descarga libpng desde la página web, encontrará un archivo llamado libpng12.dll. Copiar ese archivo en system32 no funciona, porque en realidad SDL_image busca un archivo llamado "libpng12-0.dll". He descubierto que después de haber aplicado el método IMG_GetError () en mi código. El mensaje de error dice muy claramente ...
Así que lo que hace es copiar libpng12.dll a System32 y cambie su nombre a libpng12-0.dll! Y todo funciona muy bien.