La SDL ne gère que les Bitmaps (BMP) comme on l'a vu.
A priori, ce n'est pas un très gros problème parce que la lecture des BMP est rapide pour la SDL, mais il faut reconnaître qu'aujourd'hui on est plutôt habitué à utiliser d'autres formats. En particulier, nous sommes habitués aux formats d'images "compressés" comme le PNG, le GIF et le JPEG. Ca tombe bien, il existe justement une bibliothèque
SDL_Image qui gère tous les formats suivants :
- TGA
- BMP
- PNM
- XPM
- XCF
- PCX
- GIF
- JPG
- TIF
- LBM
- PNG
Il est possible de rajouter des extensions à la SDL. Ce sont des bibliothèques qui ont besoin de la SDL pour fonctionner. On peut voir ça comme des add-ons. SDL_Image est l'une d'entre elles.
Installer SDL_image sous Windows
Téléchargement
Il y a une page spéciale sur
le site de la SDL qui référence les bibliothèques utilisant la SDL. Cette page s'intitule
Libraries, vous trouverez un lien dans le menu de gauche.
Vous pourrez voir qu'il y a pas mal de bibliothèques disponibles. Celles-ci ne proviennent pas des auteurs de la SDL généralement, ce sont plutôt des utilisateurs de la SDL qui proposent leurs bibliothèques.
Certaines sont très bonnes et méritent le détour, d'autres sont moins bonnes et encore buggées. Il faut arriver à faire le tri
Cherchez
SDL_Image dans la liste...
Bon allez, je suis de bonne humeur : voici un
lien direct vers la page de téléchargement de SDL_Image pour vous aider
Téléchargez la version de SDL_Image qui vous correspond dans la section
Binary (ne prenez PAS la source, on n'en a pas besoin !)
Si vous êtes sous Windows téléchargez
SDL_image-devel-1.2.10-VC.zip même si vous n'utilisez pas Visual C++ !
Installation
Dans ce zip vous trouverez :
- SDL_image.h : le seul header dont a besoin la bibliothèque SDL_image. Placez-le dans C:\Program Files\CodeBlocks\SDL-1.2.13\include, c'est-à-dire à côté des autres headers de la SDL.
- SDL_image.lib : placez-le dans C:\Program Files\CodeBlocks\SDL-1.2.13\lib. Oui, je sais, je vous ai dit que normalement les .lib étaient des fichiers réservés à Visual, mais ici exceptionnellement le .lib fonctionnera même avec le compilateur mingw.
- Plusieurs DLL : placez-les toutes dans le dossier de votre projet (à côté de SDL.dll donc).
Ensuite, vous devez modifier les options de votre projet pour "linker" avec le fichier SDL_image.lib.
Si vous êtes sous Code::Blocks par exemple, allez dans le menu Projects / Build options. Dans l'onglet Linker, cliquez sur le bouton "Add" et indiquez où se trouve le fichier SDL_image.lib
Si on vous demande "Keep as a relative path ?", répondez ce que vous voulez ça ne changera rien dans l'immédiat. Je recommande de répondre "Non" personnellement
Ensuite, vous n'avez plus qu'à inclure le header SDL_image.h dans votre code source. Selon l'endroit où vous avez placé le fichier SDL_image.h, vous devrez soit utiliser ce code :
Code : C | #include <SDL/SDL_image.h>
|
... soit celui-ci :
Code : C
Essayez les deux, l'un des deux devrait fonctionner.
Et voilà, la bibliothèque SDL_image devrait maintenant fonctionner (à condition que vous ayez bien fait exactement tout ce que j'ai indiqué bien sûr

)
Installer SDL_image sous Mac OS X
Si vous utilisez Mac OS X, téléchargez le fichier .dmg sur le
site de la SDL.
Copiez le fichier SDL_image.framework dans Macintosh HD/Library/Frameworks.
Copiez ensuite le fichier SDL_image.h dans SDL.framework/Headers.
Créez un nouveau projet de type "SDL Application" et faites "Add / Existing Frameworks".
Là, sélectionnez le fichier SDL_image.framework que vous venez de télécharger. C'est tout !
Petite exception pour vous, il faudra inclure le fichier .h dans votre code comme ceci :
#include "SDL_image.h"
... au lieu d'utiliser des chevrons < >. Remplacez donc la ligne d'include de SDL_image dans le gros code qui va suivre par celle que je viens de vous donner.
Charger les images
En fait, installer SDL_image est 100 fois plus compliqué que de l'utiliser, c'est vous dire la complexité du truc
Il y a UNE fonction à connaître :
IMG_Load.
Elle prend un paramètre : le nom du fichier à ouvrir.
Ce qui est génial, c'est que cette fonction est capable d'ouvrir tous les types de fichiers que gère SDL_image (GIF, PNG, JPG, mais aussi BMP, TIF...). Elle détectera toute seule le type du fichier en fonction de son extension.
Comme SDL_image peut aussi ouvrir les BMP, vous pouvez même oublier la fonction SDL_LoadBMP maintenant et n'utiliser plus que IMG_Load pour le chargement de n'importe quelle image.
Autre bon point : si l'image que vous chargez gère la transparence (comme c'est le cas des PNG et des GIF), alors SDL_image activera automatiquement la transparence pour cette image ! Cela vous évite donc d'avoir à appeler
SDL_SetColorKey
Voici le
code source complet qui charge sapin.png et l'affiche.
Notez bien que j'inclue SDL/SDL_image.h et que je ne fais pas appel à
SDL_SetColorKey car mon PNG est transparent.
Vous allez voir que j'utilise
IMG_Load partout dans ce code en remplacement de
SDL_LoadBMP.
Code : C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 | #include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h> /* Inclusion du header de SDL_image (adapter le dossier au besoin) */
void pause();
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *imageDeFond = NULL, *sapin = NULL;
SDL_Rect positionFond, positionSapin;
positionFond.x = 0;
positionFond.y = 0;
positionSapin.x = 500;
positionSapin.y = 260;
SDL_Init(SDL_INIT_VIDEO);
SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);
ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE);
SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
imageDeFond = IMG_Load("lac_en_montagne.bmp");
SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
/* Chargement d'un PNG avec IMG_Load
Celui-ci est automatiquement rendu transparent car les informations de
transparence sont codées à l'intérieur du fichier PNG */
sapin = IMG_Load("sapin.png");
SDL_BlitSurface(sapin, NULL, ecran, &positionSapin);
SDL_Flip(ecran);
pause();
SDL_FreeSurface(imageDeFond);
SDL_FreeSurface(sapin);
SDL_Quit();
return EXIT_SUCCESS;
}
void pause()
{
int continuer = 1;
SDL_Event event;
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
}
}
}
|
Résultat :
Quand même bien pratique cette petite bibliothèque
