------------------------------------------------------------------------------------------------ -- Nom : Power_Bmp / fait partie du programme Power Fractal -- -- -- -- Auteurs : Gregory Burri & Adrien Crivelli -- ------------------------------------------------------------------------------------------------ -- But : Mettre a diposition un outil pour ecrire des bmps -- ------------------------------------------------------------------------------------------------ with Ada.Sequential_Io; --Pour la gestion de fichier binaire with Power_Types; use type Power_Types.Byte; --Le format d'une couleur package body Power_Bmp is --Instanciation du paquetage. package Bmp_IO is new Ada.Sequential_Io(Byte); use Bmp_IO; --Pour stocker les info de l'entete type T_Entete is array(1..54) of Byte; --Pour generer certaines partie de l'entete function Split(A: Integer) return T_Entete is R: T_Entete; begin R(1):= Byte(A mod 256); R(2):= Byte(A / 256 mod 256); R(3):= Byte(A / 256 / 256 mod 256); R(4):= Byte(A / 256 / 256 / 256 mod 256); return R; end; ------------------------------------------------------------------------------------------------ -- Nom : Ecrire_Bmp -- -- But : Inverser une couleur RGB -- -- Parametres ---------------------------------------------------------------------------------- -- In-out : * La couleur -- ------------------------------------------------------------------------------------------------ procedure Ecrire_Bmp (Matrice_Image : in T_Matrice_Tampon; Nom_Fichier : in String) is Entete: T_Entete := (others => 0); --L'entete du fichier bmp --Entiers------------- Hauteur, --Hauteur de la matrice Largeur, --Largeur de la matrice Nb_Byte_Fin, --Nombre de byte pour finir le fichier Taille_Fichier, --La taille du fichier (byte) Taille_Image --La taille de l'image (byte) : Integer;------------ Fichier_Bmp: File_Type; --le fichier begin --Ecrire_Bmp --Definit la largeur et la hauteur de la matrice Largeur := Matrice_Image'Length(1); Hauteur := Matrice_Image'Length(2); -- --Calcul le nombre de byte de fin de fichier Nb_Byte_Fin := (Largeur * 8 rem 32) / 8; Taille_Image := (Largeur * 3 + Nb_Byte_Fin) * Hauteur; --Calcul la taille de l'image Taille_Fichier := 14 + 40 + Taille_Image; --Calcul la taille du fichier ---------------ECRITURE DE L'ENTETE--------------- Entete(1) := Character'Pos('B'); Entete(2) := Character'Pos('M'); Entete(3..6) := Split(Taille_Fichier)(1..4); Entete(11) := 54; Entete(15) := 40; Entete(19..22) := Split(Largeur)(1..4); Entete(23..26) := Split(Hauteur)(1..4); Entete(27) := 1; Entete(29) := 24; Entete(35..38) := Split(Taille_Image)(1..4); Entete(39..42) := Split(2835)(1..4); Entete(43..46) := Split(2835)(1..4); --------------------------------------------------- --Cree le fichier Create (Fichier_Bmp, Out_File, Nom_Fichier); --Ecrit l'entete dans le fichier for I in 1..54 loop Write(Fichier_Bmp, Entete(I)); end loop; --Ecrit toute la matrice (fractal) dans le fichier for X in reverse Matrice_Image'range(2) loop for Y in Matrice_Image'range(1) loop Write(Fichier_Bmp, Matrice_Image(Y, X).B); Write(Fichier_Bmp, Matrice_Image(Y, X).G); Write(Fichier_Bmp, Matrice_Image(Y, X).R); end loop; --Ecrit les bytes de fin de fichier for Z in 1..Nb_Byte_Fin loop Write(Fichier_Bmp, 0); end loop; end loop; Close(Fichier_Bmp); end Ecrire_Bmp; end Power_Bmp;