Click here to load reader

Afficher des images programmation - lecture du tutoriel

  • View
    711

  • Download
    3

Embed Size (px)

DESCRIPTION

 

Text of Afficher des images programmation - lecture du tutoriel

  • 1. Afficher des images - Programmation - Lecture du tutoriel - Le Site du...http://www.siteduzero.com/tuto-3-5432-1-afficher-des-images.html Afficher des images Dans notre premier chapitre de "vraie" pratique de la SDL, nous avons appris charger la SDL, ouvrir une fentre et grerAuteur : [email protected] les surfaces.Cr le : 20/03/2006 14h40Modifi le : 24/03/2006 Or, pour le moment nous navons appris qu crer des14h30 surfaces unies, cest--dire ayant la mme couleur. LesNoter et commenter ce tutorial surfaces unies a va un moment, mais ce serait dlicat deImprimer ce tutorial faire un jeu avec juste des carrs de couleur Dans ce chapitre, nous allons justement apprendre charger des images dans des surfaces, que ce soit des BMP, des PNG, des GIF, des JPG ou que sais-je encore Sommaire du chapitre :Charger une image BMPGestion de la transparenceCharger plus de formats dimage avec SDL_Image Q.C.M. Charger une image BMP Allons bonPourquoi est-ce quon ne va apprendre qu charger des images BMP ici ? En fait, la SDL est une librairie trs simple. Elle ne propose la base que le chargement dimages de type Bitmap (extension ".bmp"). Ne paniquez pas pour autant, car grce une extension de la SDL (la librairie SDL_Image) nous verrons quil est possible de charger de nombreux autres types. Pour commencer dj, nous allons nous contenter de ce que la SDL offre la base. Nous allons donc tudier le chargement de BMP. Le format BMP Un BMP (abrviation de Bitmap) est un format dimage. Les images que vous voyez sur votre ordinateur sont stockes dans des fichiers. Il existe plusieurs formats dimages, cest--dire plusieurs faons de coder limage dans un fichier. Selon le format, limage prend plus ou moins despace disque et est de plus ou moins bonne qualit. Le Bitmap est un format non compress (contrairement aux JPG, PNG, GIF etc.)1 sur 16 23/08/2007 02:06

2. Afficher des images - Programmation - Lecture du tutoriel - Le Site du... http://www.siteduzero.com/tuto-3-5432-1-afficher-des-images.html Concrtement, cela signifie les choses suivantes :Le fichier est trs rapide lire, contrairement aux formats compresss doivent tre dcompresss, ce qui leurprend un peu plus de temps.La qualit de limage est parfaite. Certains formats compresss comme le JPG dtriorent la qualit delimage, ce nest pas le cas du BMP.Mais le fichier est aussi bien plus gros puisquil nest pas compress ! Bref, il y a des avantages et des dfauts. Pour la SDL, lavantage cest que ce type de fichier est simple et rapide lire. Si vous avez souvent besoin de charger des images au cours de lexcution de votre programme, il vaut mieux utiliser des BMP : certes le fichier est plus gros, mais il se chargera plus vite quun GIF par exemple. Charger un bitmapTlchargement du pack dimages Nous allons travailler avec plusieurs images dans ce chapitre. Si vous voulez faire les tests en mme temps que vous lisez (et vous devriez !), je vous recommande fortement de tlcharger ce pack qui contient toutes les images dont on va avoir besoin : Tlcharger le pack dimages (1 Mo) Placez toutes les images dans le dossier de votre projet. Nous allons commencer par travailler avec le fichier lac_en_montagne.bmp. Cest une scne 3D dexemple livre avec le logiciel de modlisation Vue dEsprit (ctait lpoque o jesprais me dcouvrir un talent artistique, mais a fait belle lurette que jai abandonn )Charger limage dans une surface Nous allons utiliser une fonction qui va charger limage BMP et la mettre dans une surface. Cette fonction a pour nom SDL_LoadBMP. Vous allez voir cest ridicule tellement cest simple Code : C maSurface = SDL_LoadBMP("image.bmp"); La fonction SDL_LoadBMP remplace 2 fonctions que vous connaissez :SDL_CreateRGBSurface : qui se chargeait dallouer de la mmoire pour stocker une surface de la tailledemande (= malloc).SDL_FillRect : qui remplissait la structure dune couleur unie. Pourquoi est-ce que a remplace ces 2 fonctions ? Cest trs simple :La taille allouer en mmoire pour la surface dpend de la taille de limage : si limage fait une taille de 250x 300, alors votre surface aura une taille de 250 x 300.Dautre part, votre surface sera remplie pixel par pixel par le contenu de votre image BMP. Codons sans plus tarder2 sur 1623/08/2007 02:06 3. Afficher des images - Programmation - Lecture du tutoriel - Le Site du...http://www.siteduzero.com/tuto-3-5432-1-afficher-des-images.html Code : C int main(int argc, char *argv[]) {SDL_Surface *ecran = NULL, *imageDeFond = NULL;SDL_Rect positionFond; positionFond.x = 0; positionFond.y = 0; SDL_Init(SDL_INIT_VIDEO); ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE); SDL_WM_SetCaption("Chargement dimages en SDL", NULL); /* Chargement dune image Bitmap dans une surface */ imageDeFond = SDL_LoadBMP("lac_en_montagne.bmp"); /* On blitte par-dessus lcran */ SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond); SDL_Flip(ecran); pause(); SDL_FreeSurface(imageDeFond); /* On libre la surface */ SDL_Quit(); return EXIT_SUCCESS; } Jai donc cr un pointeur vers une surface (imageDeFond) ainsi que les coordonnes correspondantes (positionFond). La surface est cre en mmoire et remplie par la fonction SDL_LoadBMP. On la blitte ensuite sur la surface ecran et cest tout ! Admirez le rsultat :3 sur 16 23/08/2007 02:06 4. Afficher des images - Programmation - Lecture du tutoriel - Le Site du... http://www.siteduzero.com/tuto-3-5432-1-afficher-des-images.html Cest aussi simple que cela Donner une icne son application Maintenant que nous savons charger des images, nous pouvons voir comment donner une icne notre programme. Licne sera affiche en haut gauche de la fentre (et aussi dans la barre des tches). Pour le moment on a une icne par dfaut. Mais, les icnes des programmes ne sont pas des .ico normalement ? Non pas forcment ! Dailleurs les .ico nexistent que sous Windows, sur les autres OS on nen trouve pas ! La SDL rconcilie tout le monde en utilisant un truc bien elle : une surface ! Eh oui, licne dun programme SDL nest rien dautre quune bte surfaceVotre icne doit normalement tre de taille 16x16 pixels.Toutefois, sous Windows il faut que licne soit de taille 32x32 pixels sinon elle sera dforme. Ne vous enfaites pas, la SDL "rduira" les dimensions de limage pour quelle rentre dans 16x16 pixels (vous imaginezpas le temps que jai mis pour comprendre a) Pour ajouter licne la fentre, on utilise la fonction SDL_WM_SetIcon Cette fonction prend 2 paramtres : la surface qui contient limage afficher ainsi que des informations sur la transparence (NULL si on ne veut pas de transparence).La gestion de la transparence dune icne est un peu complique (il faut dire un un quels sont lespixels transparents), nous ne ltudierons donc pas. On va combiner 2 fonctions en une : Code : C SDL_WM_SetIcon(SDL_LoadBMP("sdl_icone.bmp"), NULL); Limage est charge en mmoire par SDL_LoadBMP et ladresse de la surface est directement envoye SDL_WM_SetIcon.La fonction SDL_WM_SetIcon doit tre appele avant que la fentre ne soit ouverte, cest--direquelle doit se trouver avant SDL_SetVideoMode dans votre code source. Voici le code source complet (jai juste ajout le SDL_WM_SetIcon par rapport la dernire fois) : Code : C4 sur 1623/08/2007 02:06 5. Afficher des images - Programmation - Lecture du tutoriel - Le Site du...http://www.siteduzero.com/tuto-3-5432-1-afficher-des-images.html int main(int argc, char *argv[]) {SDL_Surface *ecran = NULL, *imageDeFond = NULL;SDL_Rect positionFond; positionFond.x = 0; positionFond.y = 0; SDL_Init(SDL_INIT_VIDEO); /* Chargement de licne AVANT SDL_SetVideoMode */ SDL_WM_SetIcon(SDL_LoadBMP("sdl_icone.bmp"), NULL); ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE); SDL_WM_SetCaption("Chargement dimages en SDL", NULL); imageDeFond = SDL_LoadBMP("lac_en_montagne.bmp"); SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond); SDL_Flip(ecran); pause(); SDL_FreeSurface(imageDeFond); SDL_Quit(); return EXIT_SUCCESS; } Rsultat, licne est charge Gestion de la transparence Le problme de la transparence Nous avons charg une jolie image bitmap tout lheure dans notre fentre. Supposons que lon veuille blitter une image par-dessus. Ca vous arrivera trs frquemment, car dans un jeu en gnral le personnage que lon dplace est un bitmap, et il se dplace sur une image de fond. On va blitter limage de Zozor (la mascotte du Site du Zr0 !) sur la scne : Code : C5 sur 16 23/08/2007 02:06 6. Afficher des images - Programmation - Lecture du tutoriel - Le Site du...http://www.siteduzero.com/tuto-3-5432-1-afficher-des-images.html int main(int argc, char *argv[]) {SDL_Surface *ecran = NULL, *imageDeFond = NULL, *zozor = NULL;SDL_Rect positionFond, positionZozor; positionFond.x = 0; positionFond.y = 0; positionZozor.x = 500; positionZozor.y = 260; SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetIcon(SDL_LoadBMP("sdl_icone.bmp"), NULL); ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE); SDL_WM_SetCaption("Chargement dimages en SDL", NULL); imageDeFond = SDL_LoadBMP("lac_en_montagne.bmp"); SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond); /* Chargement et blittage de zozor sur la scne */ zozor = SDL_LoadBMP("zozor.bmp"); SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); SDL_Flip(ecran); pause(); SDL_FreeSurface(imageDeFond); SDL_FreeSurface(zozor); SDL_Quit(); return EXIT_SUCCESS; } On a juste rajout une surface pour y stocker Zozor, que lon blitte ensuite un endroit sur la scne. Le rsultat est le suivant :6 sur 16 23/08/2007 02:06 7. Afficher des images - Programmation - Lecture du tutoriel - Le Site du...http://www.siteduzero.com/tuto-3-5432-1-afficher-des-images.html Cest moche hein ? Bah oui, cest parce que tas mis un fond bleu tout moche sur limage de Zozor ! Parce que vous croyez quavec un fond noir ou un fond marron derrire Zozor a aurait t plus joli ? Ben non, le problme ici cest que notre image est forcment rectangulaire, donc si on la colle sur la scne on voit son fond et a fait moche. Heureusement, la SDL gre la transparence ! Rendre une imag

Search related