Introduction
Un petit atelier d’impression a besoin d’une carte postale composée d’une grille de couleurs. Vous exécuterez d’abord un exemple complet de quatre pixels sur quatre, lui donnerez une encre plus chaude, puis terminerez un programme C qui transforme un motif rectangulaire de caractères en véritable fichier image.
Vous devez connaître les variables, conditions, boucles, tableaux et fonctions C, ainsi que la navigation élémentaire dans un terminal. L’indexation à deux dimensions et la sortie d’images sont expliquées ici. L’environnement préparé dans le navigateur comprend le terminal Workspace et Postcard Preview. L’image est un fichier P3 PPM : des nombres lisibles, et non un PNG. La durée de lecture et de pratique est une estimation de l’auteur, pas une mesure auprès de débutants.
Imprimer et recolorer un petit exemple
Dans cette étape, vous verrez un exemple C complet devenir une image, puis vous changerez une couleur d’encre.
Ouvrez l’onglet Workspace. Son terminal se trouve dans /home/labex/project/postcards ; le cd explicite permet aussi d’y revenir après un changement de répertoire. pwd affiche le répertoire courant et ls énumère ses fichiers.
cd /home/labex/project/postcards
pwd
ls
Les fichiers préparés sont sample.c, le programme inachevé card.c et le fichier fourni art.h. Modifiez uniquement sample.c et card.c ; laissez art.h intact. cat affiche un fichier sans le modifier :
cat sample.c
L’exemple utilise une grille de quatre lignes et quatre colonnes. Dans grid[row][col], le premier indice choisit une ligne de haut en bas, et le second une colonne de gauche à droite. Tous deux commencent à zéro. Chaque élément vaut 0 ou 1 et sélectionne un triplet RGB dans color. Les composantes RGB sont le rouge, le vert et le bleu ; chacune est un entier de 0 à 255. Le second indice de color[c][0] choisit le rouge, [1] le vert et [2] le bleu.
printf écrit du texte sur la sortie standard, habituellement ce terminal. \n commence une nouvelle ligne. Un fichier P3 débute par P3, sa largeur et sa hauteur, puis la valeur maximale des composantes, 255. Viennent ensuite les triplets RGB, lus de gauche à droite dans chaque ligne, de la ligne supérieure à la ligne inférieure. Les nombres sont séparés par des espaces blancs ; un triplet par ligne est donc valide. P3 autorise aussi les commentaires #.
Compilez l’exemple. gcc est le compilateur C ; -std=c11 sélectionne C11, -Wall -Wextra active des avertissements utiles et -o sample nomme l’exécutable sample.
gcc -std=c11 -Wall -Wextra sample.c -o sample
./sample lance l’exécutable du répertoire courant. > redirige la sortie standard vers un fichier au lieu du terminal. Le shell ouvre ou remplace ce fichier avant le lancement du programme. Utilisez le nouveau nom indiqué :
./sample > sample.ppm
Passez à l’onglet Postcard Preview. Cliquez sur Refresh files, choisissez sample.ppm dans Postcard file, puis cliquez sur Open postcard. L’état indique 4 × 4 pixels · sample.ppm. Vous devez voir un motif sombre asymétrique sur fond crème. L’aperçu affiche le fichier que vous venez de créer ; il ne complète pas les pixels manquants.
Revenez à Workspace. Remplacez l’encre sombre {30, 76, 64} par la couleur chaude {170, 70, 45}. La commande d’édition sed ci-dessous utilise s/old/new/ pour remplacer ce texte exact, et -i enregistre la modification dans sample.c. Les apostrophes transmettent la substitution à sed comme un seul argument inchangé.
sed -i 's/{30, 76, 64}/{170, 70, 45}/' sample.c
Recompilez après une modification du source : l’ancien exécutable ne se met pas à jour tout seul.
gcc -std=c11 -Wall -Wextra sample.c -o sample
./sample > sample.ppm
Passez à Postcard Preview, gardez sample.ppm sélectionné et cliquez de nouveau sur Open postcard. Seule la couleur du premier plan doit changer ; les dimensions et les pixels crème restent identiques.
Si le terminal signale un fichier introuvable, revenez dans l’espace de travail avec les commandes cd et ls déjà enseignées. Si l’aperçu indique que le fichier n’existe pas, revenez à Workspace et vérifiez que la compilation a réussi avant de lancer ./sample > sample.ppm. Une erreur de compilation signifie qu’aucun nouvel exécutable n’a été construit : corrigez la ligne indiquée, puis recompilez.
Associer un motif rectangulaire à des pixels RGB
Dans cette étape, vous terminerez le générateur de cartes et ouvrirez sa véritable sortie.
Commencez dans Workspace, dans /home/labex/project/postcards. Lisez le motif fourni et le générateur inachevé :
cd /home/labex/project/postcards
cat art.h
cat card.c
#include "art.h" rend ces définitions préparées disponibles lors de la compilation de card.c. #define WIDTH 5 et #define HEIGHT 3 donnent des noms aux dimensions. pattern comporte trois lignes de cinq caractères numériques. Chaque chaîne réserve WIDTH + 1 caractères, car C stocke un terminateur de valeur zéro après les caractères visibles ; les boucles n’utilisent que les cinq positions visibles.
La première ligne, "10000", commence par la couleur 1 de la palette, puis contient quatre pixels de couleur 0. Le caractère '2' n’est pas l’entier 2. Soustraire le caractère '0' convertit l’un des caractères numériques fournis en indice de palette : '2' - '0' vaut 2. Le motif ne contient que les chiffres 0 à 3, correspondant aux quatre lignes de la palette. Conservez son motif, ses dimensions et ses couleurs. Utilisez WIDTH et HEIGHT dans les boucles pour que la recompilation fonctionne aussi avec des motifs rectangulaires fournis de 1 à 16 colonnes et lignes, utilisant les mêmes indices de palette 0 à 3.
Le générateur incomplet écrit un en-tête, mais aucun pixel. Un en-tête seul n’est pas une image. Complétez-le avec une boucle extérieure sur y (lignes) et une boucle intérieure sur x (colonnes). pattern[y][x] choisit le caractère ; palette[c][0..2] choisit ses valeurs RGB. Les marqueurs %d de printf affichent les arguments entiers dans l’ordre indiqué.
Utilisez le source complet ci-dessous. cat > card.c remplace ce fichier. <<'EOF' ouvre un here-document : le shell copie littéralement les lignes suivantes jusqu’à une ligne contenant seulement EOF. Les apostrophes autour du délimiteur empêchent l’expansion du shell dans le source C. Copiez le bloc entier, y compris le dernier EOF.
cat > card.c <<'EOF'
#include <stdio.h>
#include "art.h"
int main(void) {
printf("P3\n%d %d\n255\n", WIDTH, HEIGHT);
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
int c = pattern[y][x] - '0';
printf("%d %d %d\n", palette[c][0], palette[c][1], palette[c][2]);
}
}
return 0;
}
EOF
Compilez et générez un nouveau fichier de sortie :
gcc -std=c11 -Wall -Wextra card.c -o card
./card > original.ppm
L’outil d’inspection fourni ne fait que décoder un fichier ; il ne génère ni ne répare votre carte. Lancez-le avec le nom du fichier comme argument :
python3 /home/labex/.local/share/pixel-postcards/inspect.py original.ppm
Sortie attendue :
5 x 3 pixels; 15 RGB triples; max value 255
Pourquoi ces nombres sont-ils utiles ? Un carré pourrait masquer un échange des dimensions. Ce motif de cinq colonnes et trois lignes doit être plus large que haut, avec sa bande sombre à gauche. WIDTH contrôle la boucle intérieure et HEIGHT la boucle extérieure ; les échanger peut dépasser une ligne ou omettre des pixels.
Passez à Postcard Preview. Cliquez sur Refresh files, sélectionnez original.ppm, puis Open postcard. Vérifiez l’état 5 × 3 et comparez les lignes avec art.h. Cliquez sur Download PPM pour enregistrer le vrai fichier image. Le navigateur peut télécharger le PPM au lieu de l’afficher directement ; utilisez cet aperçu pour le voir. Revenez à Workspace pour la vérification du laboratoire.
La capture montre original.ppm sélectionné, ses dimensions enregistrées 5 × 3 et Download PPM sous l’image. Comparez la bande sombre de gauche et les trois lignes.
![]()
Conservez card.c, l’exécutable card, art.h et original.ppm dans cet espace de travail.
Si l’aperçu signale un nombre incorrect de pixels, le fichier existe mais son contenu est incomplet : vérifiez les limites des deux boucles, enregistrez card.c, recompilez et régénérez original.ppm. L’agrandissement à l’écran ne change pas les dimensions enregistrées. Dans le laboratoire suivant, vous créerez vous-même des fichiers image agrandis.
Résumé
Vous avez compilé et recoloré un petit exemple, puis associé un tableau rectangulaire de caractères à des triplets RGB. Votre programme C a créé un vrai fichier P3 que vous avez décodé, affiché et téléchargé. Vous avez pratiqué l’indexation avec la ligne en premier et la redirection de la sortie standard.

