0

Donc, je travaille sur un moteur de jeu dans Visual Studio 2013 et j'ai essayé d'utiliser la bibliothèque FreeImage v3.17, cependant, après avoir essayé d'utiliser la bibliothèque sur un exemple simple fourni par la lib elle-même, le programme est impossible de charger l'image, sauf si je l'exécute directement à partir du répertoire de construction. J'ai également testé une image de différents formats, créée par différents logiciels. Plus précisément, en utilisant uniquement le code ci-dessous, en enjambant le code, FreeImage semble deviner correctement le type de fichier de l'appel à FreeImage_GetFIFFromFilename() (c'est-à-dire fif == FIF_PNG etc.). Ensuite, l'appel à FreeImage_FIFSupportsReading(fif) renvoie true, puis essaie d'affecter dib, mais FreeImage_Load() renvoie toujours NULL.La bibliothèque FreeImage ne fonctionne pas sur le débogueur Visual Studio 2013?

Voir les commentaires avec // >:

int main(int argc, char ** argv) 
{ 
    const char* filename = "test.png"; 

    //image format 
    FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; 
    //pointer to the image, once loaded 
    FIBITMAP *dib(0); 
    //pointer to the image data 
    BYTE* bits(0); 
    //image width and height 
    unsigned int width(0), height(0); 
    //OpenGL's image ID to map to 
    GLuint gl_texID; 

    //check the file signature and deduce its format 
    fif = FreeImage_GetFileType(filename, 0); 
    //if still unknown, try to guess the file format from the file extension 
    if (fif == FIF_UNKNOWN) 
     fif = FreeImage_GetFIFFromFilename(filename); // >fif is assigned here correctly 
    //if still unkown, return failure 
    if (fif == FIF_UNKNOWN) 
     return false; 

    //check that the plugin has reading capabilities and load the file 
    if (FreeImage_FIFSupportsReading(fif)) 
     dib = FreeImage_Load(fif, filename); // >call retruns NULL every time 
    //if the image failed to load, return failure 
    if (!dib) 
     return false; // >Exits here due to failure 

    //retrieve the image data 
    bits = FreeImage_GetBits(dib); 
    //get the image width and height 
    width = FreeImage_GetWidth(dib); 
    height = FreeImage_GetHeight(dib); 
    //if this somehow one of these failed (they shouldn't), return failure 
    if ((bits == 0) || (width == 0) || (height == 0)) 
     return false; 

    // >Can't reach this from VS 
    std::cout << width << ", " << height << std::endl; 
    std::cin.get(); 

    return 0; 
} 

Cela ne se produit que lorsque je lance le programme avec le débogueur de VS, alors je soupçonne que en quelque sorte le tas de débogage est en faute. J'ai essayé de mettre _NO_DEBUG_HEAP à 1 et essayer sans déboguer, mais il n'y a aucune différence dans le comportement du programme. J'ai aussi essayé de recompiler le lib et de le lier statiquement et dynamiquement, mais toujours pas de différence. Donc, ma question est: Y at-il quelque chose que je peux faire pour déboguer davantage, si existe une solution?

+1

En fonction de votre code, l'image doit être dans le répertoire de travail actuel de l'application essayant de l'ouvrir. Le répertoire de travail initial peut être différent selon la façon dont vous lancez l'application (par exemple depuis le débogueur ou l'explorateur). Vous voulez vérifier et vous assurer que tout est correct. –

+0

@CaptainObvlious J'ai trouvé la solution et j'ai posté une réponse. J'avais l'image dans le répertoire source et le répertoire de construction, mais Visual Studio avait un problème avec ça. – ShadoWalkeR

Répondre

0

Trouvé la solution. Le problème était que, tout en utilisant le débogueur, Visual Studio était capable de lire le type de fichier à partir du dossier source ou le dossier de construction mais pas les deux en même temps. La solution était d'avoir mes fichiers dans le répertoire source (pour le débogueur) ou dans le répertoire de construction, mais pas les les deux.