Ici on va « s’amuser » à créer des images en langage C

On utilise la redirection sous unix/linux pour créer nos fichiers image .pbm

🕒 : 3 h maximum

Prérequis

  • TP7_C imagepbm image pbm machine linux (ubuntu, debian…) 
  • langage C , bases, les chars, les tableaux de chars.
  • imagemagick
  • redirections sous linux
  • Makefile 
  • Monia
  • Savoir coder en C , les bases

But

  • Découverte d’un dépot git ici sur github
  • Dessiner dans une image N&B
  • utiliser make et Makefile
  • Comprendre les pixels noirs et les pixels blanc dans le format pbm ASCII

Répertoire de travail :

Le répertoire de travail sera ~/Works/TP7_C_PBM/imagepbm_V1

Présentation

Cours sur le format pbm 

Nous allons travailler sur le code précédent , image blanche 800 X 600

Découverte de Github et code de base

Dépôt de code :

https://github.com/CielaCode/pbm_V1.git

Il faut les outils git pour utiliser github sur votre poste. (git est une création de Linus Torvald)

sudo apt update &&  sudo apt install git -y

dans votre répertoire de travail ~/Works/imagepbm

git clone https://github.com/CielaCode/pbm_V1.git

on a créé un « clone » du code sur votre machine .

#Actuellement vous avez donc un répertoire projet du nom de pbm_V1
etudiant@ordi:~/Works/TP7_C_PBM/imagepbm_V1$ tree
.
└── pbm_V1
    ├── Makefile
    └── pbm_V1.c

2 directories, 2 files
etudiant@ordi:~/Works/TP7_C_PBM/imagepbm_V1$ 

pbm_V1 ,l’ exécutable du projet obtenu en tapant la commande make 

fichier Makefile :  permettant de générer le projet à l’aide de la commande make

TARGET = pbm_V1
CFLAGS = -g -Wall -pedantic -ansi
CC = gcc
DEB = gdb

# Cible par défaut
all: $(TARGET)

$(TARGET): $(TARGET).c
	$(CC) $< $(CFLAGS) -o $@

edit: $(TARGET).c
	vi $(TARGET).c

gdb: $(TARGET)
	$(DEB) ./$(TARGET)

run: $(TARGET)
	./$(TARGET)

clean:
	rm -f $(TARGET)

.PHONY: all edit gdb run clean

fichier source c :  pbm_V1.c

/******************************************/
/** projet : pbm_V1                      **/
/** Image blanche de 800 x 600           **/
/** V1.Bogt2026 Lt Caroline Dorian       **/
/**                       17/10/2026     **/
/******************************************/
#include<stdio.h>
#include<stdlib.h>

int main()
{
int compteur;
/* en tete de l'image */
   printf("P1\n");  /* nombre magique voir wiki */
   printf("# image blanche réalisée avec pbm_V1\n");  /* commentaire du fichier */
   printf("800 600\n");  /* dimension de l'image */
/* boucle pour la génération des 480000 (800x600) pixels */
   for (compteur=0;compteur<800*600; compteur++)
       printf("0\n");
return EXIT_SUCCESS;
}
/*  faire un fichier pbm avec ce qui s'affiche */
/* ./pbm_V1 > image.pbm  */

Créons des images

A partir de maintenant il faudra créer votre Makefile dans vos projets (pbm_V1) et les autres .

une image blanche de 800 x 600

dans un répertoire   imgblc  réaliser le projet suivant.

il faut s’aider du travail précèdent. (sur l’exemple suivant on a réalisé le répertoire imgblc)

etudiant@ordi:~/Works/TP7_C_PBM/imagepbm_V1$ tree
.
├── imgblc
└── pbm_V1
    ├── Makefile
    └── pbm_V1.c

3 directories, 2 files
etudiant@ordi:~/Works/TP7_C_PBM/imagepbm_V1$ 

source :  imgblc.c 

à compiler comme vous savez faire . (ici on a même un Makefile !)

image blanche : imgblc

ici pbm_V1 est ce qui est demandé (oui ca fait une image blanche de 800×600) ! mais il vous faudra adapter le code pour réaliser le code avec le nom imgblc .

Exemple de ce que vous devez obtenir :

etudiant@ordi:~/Works/TP7_C_PBM/imagepbm_V1$ tree
.
├── imgblc
│   ├── imgblc
│   ├── imgblc.c
│   ├── imgblc.pbm
│   └── Makefile
└── pbm_V1
    ├── image.pbm
    ├── Makefile
    ├── pbm_V1
    └── pbm_V1.c

donner la commande pour compiler ce code.

tester le code, 

Comment récupérer le flux de caractère pour l’écran dans un fichier imgbc.pbm ?

faire un fichier pbm avec ce qui s’affiche

./imgblc > imgblc.pbm  
file imgblc.pbm

qui va nous donner les caractéristiques du fichier (file)

regarder ensuite avec imagemagick (la commande display)

display  imgblc.pbm   

oui regarder ce même fichier avec vi

expliquer:

Donner le pseudo code et l’organigramme de imgblc  (monia) et le Pseudo Langage

image noire : imgnoire

une image noire de 800 x 600

dans un répertoire imgnoire réaliser le projet suivant. (toujours un Makefile et un code qui fonctionnera)

à partir de l’exemple précédent donner un code qui donne une image noire.

Donner le pseudo code et l’organigramme imgnoire (monia) et le Pseudo Langage

Travaillons dans le plan, en 2 dimensions.

un plan A B C D E F  pour les colonnes

et  1 à 11 pour les lignes

On a mis 2 points dans ce tableau , trouvez les 1 !

Juste la pour expliquer comment on place des points noirs dans un tableau.

une image est un plan d’éléments binaire (bitmap). (ici pour faire très simple 1 noire et 0 blanc)

En C nous avons le tableau a 1 dimension  , une ligne: 66 caractères ,de A à F 6 colonnes et 11 lignes 6×11=66

char ligne[66]

cela représente  une ligne 66 caractères, indicé de 0 à 65

une image est une succession de ligne non?

char image[6][11]

c’est un tableau de char (octet)   de 6 x 11 . (on a rajouté une dimension , nous ne sommes plus sur une ligne mais dans un tableau)

On imagine très bien que c’est notre image  sur cet exemple pédagogique !

Et la nous allons augmenter la taille de notre image 800 x600

/******************************************/
/** Image avec points de 800 x 600       **/
/** V1.Bogt2020 LtDorian		 **/
/**                       09/11/2020	 **/
/******************************************/
#include<stdio.h>
#include<stdlib.h>
#define largeur 800
#define hauteur 600
char image[largeur][hauteur];  /* representation de notre image */
int main()

{
       int x,y;
/* remplir le tableau de '0' pour faire une image blanche */
       for (y=0; y <hauteur ; y++) /* pour toutes les lignes */	
           for (x=0; x<largeur ; x++) /* pour chaque colonnes */
	   image[x][y]='0';   /* mettre un pixel blanc */
/* on place un point sur l'image coordonnées 320,456 */
image[320][456]='1';  /* il suffit de mettre un 1 dans la bonne case ! */
/* on place un point sur l'image coordonnées 501,322 */
image[501][322]='1';
/*Afficher l'image Pbm en ASCII*/
/* en tete de l'image */
       printf("P1\n");
/* pas de commentaire */
/* on donne les coordonnées en décimal dans l’entête */
       printf("%d %d\n",largeur,hauteur);
/* on place tous les pixels */
       for (y=0; y <hauteur ; y++) /* pour toutes les lignes */	
           for (x=0; x<largeur ; x++) /* pour chaque colonnes */
	   printf ("%c \n",image[x][y]);
return EXIT_SUCCESS;
}
/*  faire un fichier pbm avec ce qui s'affiche */
/* ./bitmap > bitmap.pbm  */

Avez vous vu les 2 points ???

cross (croix) . Ajoutons des axes X et Y

Dans un projet cross , écrire un code cross.c et son Makefile

on désire dessiner  des axes (une croix)  sur notre image.

pt1 (399,0) à  pt2 (399,599) pour l’axe X

pt3 (0,299) à pt4 (799,299)

pour avoir cette image on peut remplir à la main chaque pixel …

image[399][0]='1';
image[399][1]='1';
image[399][2]='1';
...
etc
image[399][799]='1';

franchement on a inventer l’ordinateur pour ne pas faire ce genre de tâches fastidieuses trouver une solution autre pour réaliser les axes.

proposer une solution

Donner un code avec son pseudo code et son organigramme (monia)

, pour comparer à votre solution , git : https://github.com/CielaCode/cross.git

/******************************************/
/** projet : cross                       **/
/** Image blanche de 800 x 600 et axes   **/
/** V1.Bogt2026 Lt Caroline Dorian       **/
/**                       17/10/2026     **/
/******************************************/
#include<stdio.h>
#include<stdlib.h>

#define DIMX 800    /* macros */
#define DIMY 600

/* variable globale de l'image */
char image [DIMX][DIMY];

int main()
{
/* variables locales du main */
int compteur_x; /*0 à 799 */
int compteur_y; /*0 à 599 */
/* en tete de l'image */
       printf("P1\n");   /* nombre magique */
/* pas de commentaire */
       printf("%d %d\n",DIMX,DIMY);

/* génération des DIMX x DIMY pixels blancs */
   /* on a rempli de blanc '0' */
   for (compteur_y=0; compteur_y<DIMY ; compteur_y++)
       {
       for (compteur_x=0; compteur_x<DIMX ; compteur_x++)
           {
           image[compteur_x][compteur_y]='0';
           }
       }

/* axe horizontal */
   for (compteur_x=0; compteur_x <DIMX ; compteur_x++)
          image[compteur_x][DIMY/2]='1';

/* axe vertical*/
    for (compteur_y=0; compteur_y <DIMY ; compteur_y++)
          image[DIMX/2][compteur_y]='1';

/* on affiche les pixels en pacourant le tableau image */    
    for (compteur_y=0; compteur_y<DIMY ; compteur_y++)
    {
        for (compteur_x=0; compteur_x<DIMX ; compteur_x++)
            {
                printf("%c\n",image[compteur_x][compteur_y]);
            }
    }
return EXIT_SUCCESS;
}
/*  faire un fichier pbm avec ce qui s'affiche */
/* ./cross > cross.pbm  */

Makefile

TARGET = cross
CFLAGS = -g -Wall -pedantic -ansi
CC = gcc
DEB = gdb

# Cible par défaut
all: $(TARGET)

$(TARGET): $(TARGET).c
	$(CC) $< $(CFLAGS) -o $@

edit: $(TARGET).c
	vi $(TARGET).c

gdb: $(TARGET)
	$(DEB) ./$(TARGET)

run: $(TARGET)
	./$(TARGET)

clean:
	rm -f $(TARGET)

.PHONY: all edit gdb run clean