' Fichier t‚l‚charg‚ depuis QBWorld, le paradis des programmeurs QBasic: ' ' -*-*-*-*-*-*-*-*- ' http://www.qbworld.fr.st ' -*-*-*-*-*-*-*-*- ' ' -*-*-*-*-*-*-*-*- ' Par Matthieu LarŠre (2002) ' ' Voil… un petit programme que j'ai fait pour afficher de images BMP dont la ' taille doit ˆtre comprise entre 320 pixels de largeur et 200 de hauteur, et ' ne pas d‚passer les 256 couleurs (SCREEN 13 oblige). Attention, l'image ' ne doit pas avoir subit de compression, c'est pourquoi je vous conseil de ' la cr‚er avec des petits programmes dans le genre Paint. ' ATTENTION: Pensez … l'enregistrer comme une image 256 couleurs. ' Vous pouvez ais‚ment insŠrer ces lignes de code dans une SUB de vos jeux. ' Pour le moment, l'image n'est pas stock‚e dans la m‚moire aprŠs son ' chargement (avec une image 320*200*256, elle serait pleine!), mais je bosse ' sur un fichier o— ce serait possible, et o— il resterait encore ‚norm‚ment ' de place (en faisant appel … CALL ABSOLUTE). ' Si je r‚ussi … trouver la bibliothŠque pour passer en mode 1024*768 avec ' 16,7 millions de couleurs (parait ‡a peut que se faire en QBasic?), je ' promet de tout faire pour adapter le programme rapidement. ' ' Comme je suis complŠtement tordu, j'ai tout expliqu‚ dans les moindres ' d‚tails, la structure d'un Bitmap de 256 couleurs ne devrait donc plus avoir ' de secret pour vous aprŠs la lecture de ce listing. ' ' Au fait, si vous utilisez ce programme dans les v“tres, essayez de penser ' … noter dans les cr‚dits que j'ai cr‚e ce systŠme de chargement de BMP! IF (COMMAND$ = "") THEN CLS PRINT " BMPLOAD: Utilitaire de chargement & affichage des images Bitmaps en 320*200" PRINT " et 256 couleurs (en supposant qu'aucune compr‚ssion de celle-ci n'est active)" PRINT INPUT "Chemin du fichier...(exemple: C:\Windows\Chien.bmp):", nom$ IF nom$ = "" THEN END ELSE nom$ = COMMAND$ END IF IF INSTR(nom$, ".") = 0 THEN ' V‚rifie si une extension … ‚t‚ sp‚cifi‚e, nom$ = nom$ + ".BMP" ' sinon la rajoute. END IF ' D‚part du chargement du l'image OPEN nom$ FOR BINARY AS #1 GET #1, 19, BMPWidth% ' Largeur de l'image GET #1, 23, BMPHeight% ' Hauteur de l'image ' Les diverses d‚clarations de donn‚es DIM couleur(255) AS LONG ' D‚finie le tableaux contenant les couleurs DIM bleu, vert, rouge AS LONG ' variables du bleu, rouge et vert (RVB) DIM col AS LONG ' Donn‚e pour la palette DIM c AS INTEGER ' D‚finie la variable de la boucle SEEK #1, 54 ' Se placer … l'octet 54 FOR c = 0 TO 255 ' D‚marre la boucle rien = ASC(INPUT$(1, #1)) \ 4 ' Intensit‚ du vide de la couleur (fait styl‚) bleu = ASC(INPUT$(1, #1)) \ 4 ' Intensit‚ du bleu de la couleur vert = ASC(INPUT$(1, #1)) \ 4 ' Intensit‚ du vert de la couleur rouge = ASC(INPUT$(1, #1)) \ 4 ' Intensit‚ du rouge de la couleur col = rouge + vert * 256 + bleu * 65536 ' Je pense pouvoir expliquer ‡a par ‡a ' Col = intensit‚ de la couleur ' il y a 256 valeurs d'intensit‚ pour chaque couleurs. Il y a 3 couleurs ' (rouge, vert & bleu) donc 256^3 intensit‚ diff‚rentes. ' Le rouge est la premiŠre intensit‚ sp‚cifi‚e donc: col = rouge * 1 ' Le vert est la deuxiŠme intensit‚ sp‚cifi‚e donc col = rouge * 1 + vert * 256 ' (on multiplie le vert par 256 pour ‚viter de retomber sur une de valeurs ' du rouge. Ainsi en y a ajoutant la valeur du rouge, on ajuste l'intensit‚ ' Suivant le mˆme proc‚d‚ (si vous avez compris), on d‚cide que le bleu est ' la troisiŠme intensit‚ sp‚cifi‚ donc col = rouge*1 + vert*256 + bleu*65536 ' Pourquoi 65536? parce que 256*256 et oui, ainsi, on ne retombera pas sur ' les valeurs du vert, et les diff‚rences entre les valeurs du bleu*65536 ' seront combl‚es par celle d‚j… implant‚s du rouge et du vert. ' Il est certains que je me suis mal expliqu‚, mais c'est pas trŠs ‚vident … ' faire comprendre. Enfin bon, m‚ditez les lignes pr‚c‚dentes! couleur(c) = col ' Place l'intensit‚ de la couleur dans le ' tableau des couleurs NEXT c ' fin de la boucle de couleur SCREEN 13 ' Sp‚cifie la mode d'‚cran PALETTE USING couleur(0) ' Charge la palette d‚finie juste avant SEEK #1, 1079 ' Se place … l'octet 1079 FOR y% = BMPHeight% - 1 TO 0 STEP -1 ' Par de la fin de l'image pour la lire FOR x% = 1 TO BMPWidth% - 1 ' et l'afficher PSET (x%, y%), ASC(INPUT$(1, #1)) NEXT x% NEXT y% CLOSE ' Ferme le fichier SLEEP ' Vous n'avez vraiment pas compris l'histoire avec la palette RVB? Pas de ' panique, tonton Matthieu va vous faire un exemple: ' Rouge = 30 ' Vert = 30 ' Bleu = 30 ' Col = Rouge * 1 + Vert * 256 + Bleu * 65536 ' donc Col = 30 * 1 + 30 * 256 + 30 * 65536 ' Col = 30 + 7680 + 1966080 ' Col = 1973790 ' Si rouge avait ‚t‚ ‚gal … 31 alors Col vaudrait 1 de plus soit 1973791 ' Je ne suis pas convaincu d'avoir ‚t‚ convaincant... ' Les valeurs charg‚es Rouge, Vert et Bleu valent qq chose entre 0 et 255 ' Rouge est multipli‚ par 1 donc les valeurs de rouge sont comprises entre 0 ' et 256 ' En multipliant Vert par 256, on s'assure qu'il vaille soit 0, soit plus de ' 256, et surtout, moins de 65280 ou ‚gal … cet valeur. En ajoutant la valeur ' du rouge … ceci, on obtiendra alors une valeur comprise entre 0 et 65535. ' Pourquoi avoir fait ceci? ' En ne changeant pas la valeur du rouge, on sait qu'il vaudra entre 0 et 255 ' En multipliant la valeur du vert par 256, on obtient invariablement un ' multiple de 256. Les valeurs manquantes entre ces multiples sont combl‚es ' en y ajoutant la valeur du rouge. Pour chaque combinaison de rouge et vert ' on obtient ainsi une des 65536 intensit‚ diff‚rentes possibles pour ces ' couleurs, ce qui est normal, puisque l'on multiplie 256 couleurs possibles ' par 256 autres couleurs. ' On sait que la combinaison du rouge et du bleu donne 65536 couleurs toutes ' diff‚rentes. Donc (puisque l'une de ces couleurs vaut 0), alors cette ' combinaison vaut entre 0 et 65535. Ainsi, en multipliant la valeur du bleu ' par 65536, on s'assure qu'il vaudra soit 0, soit plus de 65536 (un multiple ' de 65536 quoi!), et que cette nouvelle valeur sera combl‚e (pour les mˆmes ' raisons qu'avec le vert et le rouge) par la valeur prise par la combinaison ' entre le vert et le rouge. ' ' Ainsi, cette algorithme d'apparence toute simple se r‚vŠle un parfait ' systŠme de codage de 256 couleurs parmis 16,7 millions. Quand on pense … ' toutes les lignes qu'il faut pour expliquer cet imposture... ' L…, on ne pas ˆtre plus clair (je pense), ce qui se con‡oit bien s'explique ' bien disait un grand esprit dont le nom m'‚chappe (Rabelais?), vous devriez ' donc avoir compris ce que j'ai compris seul (c'est la fiert‚ de ma vie). ' ' Pour ceux qui ont trouv‚ tout cela difficile … comprendre, je voudrais ' pr‚ciser que le format BMP est l'un des plus simple existant dans le monde ' des PC puisqu'il n'est pas compress‚. Bien ‚videment, pour que les non- ' initi‚s ne le comprennent pas, les ing‚nieurs tordus qui l'ont invent‚ ' ont d‚cid‚ de l'enregistrer de bas en haut. ' ' Pour ceux qui admirent mes capacit‚s d'explications, j'ai ‚crit un ouvrage: ' "Les Bitmaps & moi" dans lequel je retrace ma longue et ƒpre quˆte … la ' recherche du systŠme cryptage des Bitmaps de l'OS de nos amis de 'Krosoft. ' Il est disponible aux ‚dition "Livre peu voir pas int‚ressant" et se trouve ' dans toutes les bonnes crˆmeries.