Programmation avec la SDL/Afficher une image

Programmation avec la SDL
Sommaire
L' affichage vidéo
L'essentiel
Approfondissement
La gestion des évènements
Annexes
Modifier ce modèle

Dans ce chapitre, nous allons aborder la gestion des images avec la SDL. Bien que ce chapitre soit beaucoup moins important que les quatre précédents, il reste néanmoins nécessaire à la création d'un jeu en 2D. En effet, ce serait une assez mauvaise idée de vouloir créer tous les décors simplement en traçant des lignes et des rectangles dans des textures. Nous allons donc voir comment importer des images et les afficher. Dans l'absolu, la SDL n'est capable d'importer que des images au format Windows bitmap dont l'extension est .bmp. Heureusement, il existe une librairie permettant de manipuler d'autres formats : SDL_Image, que nous présenterons par la suite.

Importer une image au format bitmap modifier

Le seul format d'image géré par la SDL 2.0 est le format bitmap. Pour importer une image au format bitmap, nous allons utiliser des surfaces (SDL_Surface pour la SDL). Nous ne détaillerons pas ici l'utilisation des surfaces. Pour une étude plus approfondie, reportez-vous au chapitre Les surfaces. Voici la fonction qui permet d'importer une image au format bmp :

SDL_Surface* SDL_LoadBMP(const char* file);

La fonction renvoie NULL s'il s'est produit une erreur. La chaîne de caractère attendue est le chemin permettant d'atteindre l'image. Par exemple, si on souhaite charger l'image image.bmp qui se trouve dans le répertoire courant du projet, on importera l'image ainsi :

SDL_Surface* image = SDL_LoadBMP("image.bmp");

Il ne nous reste plus qu'à convertir la surface en texture pour afficher l'image. Attention, la texture obtenue ne peut pas être modifiée par les fonctions du renderer. Si vous souhaitez modifier l'image importée , rendez-vous au chapitre Les surfaces. Voici donc le code complet pour importer une image :

SDL_Surface* image = SDL_LoadBMP("image.bmp");
if(!image)
{
    printf("Erreur de chargement de l'image : %s",SDL_GetError());
    return -1;
}
SDL_Texture* monImage = SDL_CreateTextureFromSurface(renderer,image);  //La texture monImage contient maintenant l'image importée
SDL_FreeSurface(image); //Équivalent du destroyTexture pour les surface, permet de libérer la mémoire quand on n'a plus besoin d'une surface

La plupart du temps, lorsque vous obtenez une erreur, c'est que vous avez mal renseigné le chemin permettant d'atteindre l'image. Vous obtenez alors une erreur du type

Couldn't open ***.bmp

Utiliser la bibliothèque SDL_Image 2.0 modifier

Si vous trouvez qu'il est trop restreignant de n'utiliser que des bmp, cette bibliothèque est faite pour vous. Voici la liste des formats qu'elle gère :

  • JPG (.jpg ou .jpeg)
  • PNG
  • GIF
  • BMP
  • TGA
  • XPM
  • PNM
  • PCX
  • TIF (.tif ou .tiff)
  • LBM (.lbm ou.iff)


Installation modifier

Linux (Code::Blocks) modifier

Avant de commencer l'installation, assurez vous que les librairies des formats que vous souhaitez utiliser sont bien installées notamment libjpeg, zlib et libpng. Si ce n'est pas le cas, installez les versions à jour depuis le gestionnaire de paquets. Ensuite, installez libsdl2-image-2.0-0 depuis le gestionnaire de paquets. Enfin, dans Code::Blocks, cliquez sur Project-> Build options... ->Linker settings puis ajoutez la ligne -lSDL2_image dans "Other linker options". Vous pouvez alors utiliser SDL_Image dans Code::Blocks.

Importer une image modifier

Pour importer une image avec SDL_Image, il faut commencer par inclure la librairie :

#include "SDL2/SDL_image.h"

Vous n'avez alors besoin de connaître qu'une fonction : IMG_Load. Celle-ci fonctionne exactement sur le même principe, sauf que vous pouvez lui envoyer des fichiers avec les extensions décrites ci-dessus. Ainsi, on importera l'image image.png se trouvant dans le répertoire courant en écrivant

SDL_Surface* image = IMG_Load("image.png");
if(!image)
{
    printf("Erreur de chargement de l'image : %s",SDL_GetError());
    return -1;
}

Si tout s'est bien passé, il ne vous reste plus qu'à convertir votre surface en texture comme dans le code plus haut puis à libérer la mémoire occupée par la surface en utilisant SDL_FreeSurface.

Si vous obtenez une erreur du type

Couldn't open ***.png

elle provient probablement d'une erreur dans le chemin permettant d'atteindre l'image. En revanche, il se peut que vous obteniez une erreur du type

unsupported image format

Il est alors probable que les bibliothèques correspondant au format que vous voulez importer soit ne sont pas installées sur votre ordinateur, soit ne sont pas correctement linkées (pour windows, ajoutez les .dll de ces librairies dans le dossier de votre projet).