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?
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. –
@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