home

Programmation Fortran VII formats PBM et PGM

Comment sauvegarder une image lisible rapidement et uniquement en utilisant le compilateur Fortran!

Le format PGM

Fortran n'est pas le premier langage qui vous vient à l'esprit quand on parle de graphismes. Ecrire une image png, binaire n'est pas une opération triviale.

Une alternative pour s'amuser avec des commandes simples mais en produisant tout du moins une image est d'employer un format ASCII. ASCII Signifie que cette image sera un simple fichier texte, lisible par votre éditeur (ainsi qu'un humain). Le format particulier que nous allons employer est le format PGM.

Selon la page descriptive du site d'Adobe: Le format PGM, qui a été inventé à la fin des années 1980 aux États-Unis, se caractérise par sa simplicité. Un fichier PGM contient une seule image simple à retoucher et pour laquelle il est facile d’écrire des programmes.

Une image PGM peut en effet être écrite dans un éditeur de texte, par exemple:

P2
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

quand il est ouvert en tant qu'image avec Gimp ou MuFortran donne

Le fichier texte, quand ouvert avec un lecteur d'image.

En regardant de plus prêt au fichier texte, on remarquera qu'il se compose de

Ecriture d'un tel fichier en fortran

On commence par écrire simplement la chaine P2

integer :: pgm_file = 11
open(file="image.pgm", unit=pgm_file)
write(pgm_file, '(A2)') "P2"

Ensuite, il faut écrire la forme de la matrix ou résolution de l'image. Attention qu'il s'agit du nombre de colonnes suivi du nombre de lignes ici!

write(pgm_file, '(I03, x, I03)') size(img, 2), size(img, 1)

Une dernière étape avec d'écrire la matrice en elle-même: la profondeur de gris:

write(pgm_file, '(I03)') maxval(maxval(img))

Enfin, la matrice

write(pgm_file, imatrix_format(img)) transpose(img)

La fonction imatrix_format est une fonction du genre

character(len=128) function imatrix_format(A) result(fmt)
    write (fmt, '(A, I3, A, I3, A)') '(', size(A, 1), '(', size(A, 2), '(I04,1x)/))'
end function

N'oublions pas de fermer le fichier:

close(unit=pgm_file)

home