2010-10-17 53 views
4

我正在使用IMG_Load()加載png文件,但它根本無法工作。 loadedImage = IMG_Load(filename.c_str());在這句話之後,loadedImage仍然是NULL,沒有發生錯誤。 PS:我正在使用VS C++ 2008,png文件位於develop文件夾中。這裏是我的代碼(這正是懶惰美孚等)SDL_image的IMG_Load不起作用

//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; 
} 

輸出返回5.

回答

6

我不好。 我只是將SDL_image.dll複製到exe floder。 我也應該複製zlib1.dll和libpng12-0.dll 實際上,所有的dll都是需要的,因爲如果沒有這樣的dll,程序不會給出任何錯誤提示,這是令人困惑的。

+0

我花了半天的時間試圖找出這個相同的問題。無論我做什麼,它都會呈現一個空白的黑色圖像。發現其他dll只是需要在那裏,謝謝你張貼這個答案 – morbidhawk 2017-12-03 23:25:44

1

如果您從網站下載libpng,您會發現一個名爲libpng12.dll的文件。將該文件複製到system32不起作用,因爲SDL_image實際上查找名爲「libpng12-0.dll」的文件。在我的代碼中實現了IMG_GetError()方法後,我發現了這一點。該錯誤消息說得很清楚...

因此,您所做的是將libpng12.dll複製到system32並將其重命名爲libpng12-0.dll!一切正常。