La SDL ne gère que les Bitmap (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 a plutôt l'habitude d'utiliser d'autres formats. En particulier, nous sommes habitués aux formats d'images « compressés » comme le PNG, le GIF et le JPEG. Ça 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 en fait 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 (on emploie aussi parfois le mot « greffon », plus français).
SDL_Image est l'une d'entre elles.
Installer SDL_image sous Windows
Téléchargement
Une page spéciale du site de la SDL 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 beaucoup de bibliothèques disponibles. Celles-ci ne proviennent généralement pas des auteurs de la SDL, ce sont plutôt des utilisateurs de la SDL qui proposent leurs bibliothèques pour améliorer la SDL.
Certaines sont très bonnes et méritent le détour, d'autres sont moins bonnes et encore boguées. Il faut arriver à faire le tri.
Cherchez
SDL_Image dans la liste… vous arriverez sur
la page dédiée à SDL_Image.
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, et ce 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 : copiez 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 (fig. suivante).
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 par la négative, 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.
Si vous êtes sous Visual Studio, la manipulation est quasiment la même. Si vous avez réussi à installer la SDL, vous n'aurez aucun problème pour installer SDL_image.
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 et mettez-le dans le dossier
/Library/Frameworks (
/Bibliothèque/Frameworks en français).
Ensuite, tapez « search paths » dans le champ de recherche de Xcode. Repérez la ligne
Header search paths ; double-cliquez sur la ligne à droite, et ajoutez « /Library/Frameworks/SDL_image.framework/Headers ».
Il ne vous reste plus qu'à ajouter le framework à votre projet. La figure suivante vous montre à quoi ressemble le
Header search paths du projet après avoir installé
SDL_image.
Il faudra en revanche inclure le fichier
.h dans votre code comme ceci :
Code : C
… au lieu d'utiliser des chevrons
< >. Remplacez donc la ligne d'
include de
SDL_image dans le 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é de la bibliothèque !
Il y a UNE seule fonction à connaître :
IMG_Load.
Elle prend un paramètre : le nom du fichier à ouvrir.
Ce qui est pratique, 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 maintenant la fonction SDL_LoadBMP et ne plus utiliser 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.
Je vais vous présenter le code source 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 naturellement 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;
}
}
}
|
Comme on peut le voir sur la fig. suivante, l'image PNG a été insérée avec la transparence sur l'image de fond !