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

On utilise la redirection pour créer nos fichiers

🕒 : 3 h maximum

Le répertoire de travail sera ~/Works/L2PBM

Prérequis

  • TP L1 image pbm machine linux (ubuntu, debian…) 
  • langage C , bases, les chars, les tableaux de chars.
  • imagemagick
  • redirections sous linux
  • Makefile 

But

  • Dessiner dans une image N&B

Présentation

Cours sur le format pbm 

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

Dans un répertoire ~/Works/L2PBM/imagepbm

Découverte de Github 

Dépôt de code 

https://github.com/CarolineDorian/l2pbm

Il faut les outils github sur votre poste.

sudo apt update &&  sudo apt install git -y

au lycée on a un proxy à traverser :

# réglage du proxy pour l'utilisation de git (pour github) au lycée
git config --global http.proxy 10.0.0.1:3128  #si proxy comme au lycée uniquement!

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

git clone https://github.com/CarolineDorian/l2pbm.git

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

Actuellement vous avez donc un répertoire projet du nom de l2pbm
bruno@elliott:~/Works$ tree imagepbm/
imagepbm/
└── l2pbm
    ├── l2pbm
    ├── l2pbm.c
    └── Makefile
2 directories, 3 files
bruno@elliott:~/Works$ 

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

fichier source c :  l2pbm.c

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

/******************************************/
/** Image blanche de 800 x 600           **/
/** V1.Bogt2020 LtDorian		 **/
/**                       09/11/2020	 **/
/******************************************/
#include<stdio.h>
#include<stdlib.h>

int main()
{
       int compteur;
/* en tete de l'image */
       printf("P1\n");
/* pas de commentaire */
       printf("800 600\n");
/* génération des 480000 pixels */
       for (compteur=0;compteur<800*600; compteur++)
                       printf("0\n");
return EXIT_SUCCESS;
}
/*  faire un fichier pbm avec ce qui s'affiche */
/* ./imgblc > imgblc.pbm  */

Créons des images

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.

source :  imgblc.c 

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

image blanche : imgblc

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.

à 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.

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 

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

Le projet sera dans un répertoire  bitmap

/******************************************/
/** 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 ???

Ajoutons des axes X et Y

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

/******************************************/
/** Image blanche de 800 x 600           **/
/** V1.Bogt2025 LtDorian		 **/
/**                       29/09/2025	 **/
/******************************************/
#include<stdio.h>
#include<stdlib.h>

#define DIMX 800
#define DIMY 600

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

int main()
{
       int compteur_x; /*0 à 799 */
       int compteur_y; /*0 à 599 */

/* en tete de l'image */
       printf("P1\n");
/* 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';

       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
#Makefile petit projet avec skeletonc
CFLAGS = -g -Wall -pedantic -ansi
CC = gcc
DEB = gdb

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


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

gdb:	$(TARGET)
	$(DEB) $(TARGET)

clean:
	rm $(TARGET)