1 ------------------------------------------------------------------------------------------------
2 -- Nom : Power_Bmp / fait partie du programme Power Fractal --
4 -- Auteurs : Gregory Burri & Adrien Crivelli --
5 ------------------------------------------------------------------------------------------------
6 -- But : Mettre a diposition un outil pour ecrire des bmps --
7 ------------------------------------------------------------------------------------------------
9 with Ada
.Sequential_Io
; --Pour la gestion de fichier binaire
10 with Power_Types
; use type Power_Types
.Byte
; --Le format d'une couleur
12 package body Power_Bmp
is
14 --Instanciation du paquetage.
15 package Bmp_IO
is new Ada
.Sequential_Io(Byte
); use Bmp_IO
;
17 --Pour stocker les info de l'entete
18 type T_Entete
is array(1..54) of Byte
;
20 --Pour generer certaines partie de l'entete
21 function Split(A
: Integer) return T_Entete
is
24 R(1):= Byte(A
mod 256);
25 R(2):= Byte(A
/ 256 mod 256);
26 R(3):= Byte(A
/ 256 / 256 mod 256);
27 R(4):= Byte(A
/ 256 / 256 / 256 mod 256);
31 ------------------------------------------------------------------------------------------------
32 -- Nom : Ecrire_Bmp --
33 -- But : Inverser une couleur RGB --
34 -- Parametres ----------------------------------------------------------------------------------
35 -- In-out : * La couleur --
36 ------------------------------------------------------------------------------------------------
37 procedure Ecrire_Bmp (Matrice_Image
: in T_Matrice_Tampon
; Nom_Fichier
: in String) is
39 Entete
: T_Entete
:= (others => 0); --L'entete du fichier bmp
41 --Entiers-------------
42 Hauteur
, --Hauteur de la matrice
43 Largeur
, --Largeur de la matrice
45 Nb_Byte_Fin
, --Nombre de byte pour finir le fichier
47 Taille_Fichier
, --La taille du fichier (byte)
48 Taille_Image
--La taille de l'image (byte)
49 : Integer;------------
51 Fichier_Bmp
: File_Type
; --le fichier
55 --Definit la largeur et la hauteur de la matrice
56 Largeur
:= Matrice_Image
'Length(1);
57 Hauteur
:= Matrice_Image
'Length(2);
60 --Calcul le nombre de byte de fin de fichier
61 Nb_Byte_Fin
:= (Largeur
* 8 rem 32) / 8;
64 Taille_Image
:= (Largeur
* 3 + Nb_Byte_Fin
) * Hauteur
; --Calcul la taille de l'image
65 Taille_Fichier
:= 14 + 40 + Taille_Image
; --Calcul la taille du fichier
67 ---------------ECRITURE DE L'ENTETE---------------
68 Entete(1) := Character'Pos('B');
69 Entete(2) := Character'Pos('M');
70 Entete(3..6) := Split(Taille_Fichier
)(1..4);
74 Entete(19..22) := Split(Largeur
)(1..4);
75 Entete(23..26) := Split(Hauteur
)(1..4);
78 Entete(35..38) := Split(Taille_Image
)(1..4);
79 Entete(39..42) := Split(2835)(1..4);
80 Entete(43..46) := Split(2835)(1..4);
81 ---------------------------------------------------
84 Create (Fichier_Bmp
, Out_File
, Nom_Fichier
);
86 --Ecrit l'entete dans le fichier
88 Write(Fichier_Bmp
, Entete(I
));
91 --Ecrit toute la matrice (fractal) dans le fichier
92 for X
in reverse Matrice_Image
'range(2) loop
93 for Y
in Matrice_Image
'range(1) loop
94 Write(Fichier_Bmp
, Matrice_Image(Y
, X
).B
);
95 Write(Fichier_Bmp
, Matrice_Image(Y
, X
).G
);
96 Write(Fichier_Bmp
, Matrice_Image(Y
, X
).R
);
99 --Ecrit les bytes de fin de fichier
100 for Z
in 1..Nb_Byte_Fin
loop
101 Write(Fichier_Bmp
, 0);