Einführung
Eine kleine Druckwerkstatt benötigt eine Postkarte aus einem Farbraster. Du führst zuerst ein vollständiges Beispiel mit vier mal vier Pixeln aus, gibst ihm eine wärmere Druckfarbe und vervollständigst anschließend ein C-Programm, das ein rechteckiges Zeichenmuster in eine echte Bilddatei umwandelt.
Du brauchst C-Variablen, Bedingungen, Schleifen, Arrays und Funktionen sowie grundlegende Terminalnavigation. Zweidimensionale Indizes und die Bildausgabe werden hier erklärt. Die vorbereitete Browserumgebung enthält das Terminal Workspace und Postcard Preview. Das Bild ist eine P3-PPM-Datei: lesbare Zahlen, kein PNG. Die Lese- und Übungszeit ist eine Schätzung des Autors, keine gemessene Bearbeitungszeit für Anfänger.
Ein kleines Beispiel ausgeben und umfärben
In diesem Schritt siehst du, wie ein vollständiges C-Beispiel zu einem Bild wird, und änderst anschließend eine Druckfarbe.
Öffne den Tab Workspace. Das Terminal befindet sich in /home/labex/project/postcards; mit dem ausdrücklich angegebenen cd kannst du nach einem Verzeichniswechsel zurückkehren. pwd zeigt das aktuelle Verzeichnis, ls dessen Dateien.
cd /home/labex/project/postcards
pwd
ls
Vorbereitet sind sample.c, das unvollständige card.c und das bereitgestellte art.h. Ändere nur sample.c und card.c; lasse art.h unverändert. cat zeigt eine Datei an, ohne sie zu bearbeiten:
cat sample.c
Das Beispiel verwendet ein Raster mit vier Zeilen und vier Spalten. Bei grid[row][col] wählt der erste Index eine Zeile von oben nach unten, der zweite eine Spalte von links nach rechts. Beide beginnen bei null. Jeder Eintrag ist 0 oder 1 und wählt ein RGB-Tripel aus color. RGB steht für Rot, Grün und Blau; jede Komponente ist eine ganze Zahl von 0 bis 255. Der zweite Index in color[c][0] wählt Rot, [1] Grün und [2] Blau.
printf schreibt Text auf die Standardausgabe, normalerweise dieses Terminal. \n beginnt eine neue Zeile. P3-Dateien beginnen mit P3, Breite und Höhe und danach dem größten Komponentenwert 255. Es folgen RGB-Tripel, von links nach rechts in jeder Zeile und von der obersten zur untersten Zeile gelesen. Leerraum trennt die Zahlen; ein RGB-Tripel pro Zeile ist daher zulässig. P3 erlaubt außerdem #-Kommentare.
Kompiliere das Beispiel. gcc ist der C-Compiler; -std=c11 wählt C11, -Wall -Wextra aktiviert hilfreiche Warnungen und -o sample nennt die ausführbare Datei sample.
gcc -std=c11 -Wall -Wextra sample.c -o sample
./sample startet die ausführbare Datei im aktuellen Verzeichnis. > leitet die Standardausgabe in eine Datei statt ins Terminal um. Die Shell öffnet oder ersetzt diese Datei vor dem Programmstart. Verwende den hier angegebenen neuen Dateinamen:
./sample > sample.ppm
Wechsle zum Tab Postcard Preview. Klicke auf Refresh files, wähle unter Postcard file die Datei sample.ppm und klicke auf Open postcard. Der Status zeigt 4 × 4 pixels · sample.ppm. Du solltest ein dunkles asymmetrisches Zeichen auf cremefarbenem Hintergrund sehen. Die Vorschau zeigt die gerade erzeugte Datei; fehlende Pixel werden nicht ergänzt.
Kehre zu Workspace zurück. Ändere die dunkle Druckfarbe von {30, 76, 64} in die warme Farbe {170, 70, 45}. Der Textbearbeitungsbefehl sed verwendet s/old/new/, um genau diesen Text zu ersetzen, und speichert mit -i die Änderung in sample.c. Die einfachen Anführungszeichen übergeben die Ersetzung als ein unverändertes Argument an sed.
sed -i 's/{30, 76, 64}/{170, 70, 45}/' sample.c
Kompiliere nach einer Quelltextänderung erneut; die alte ausführbare Datei aktualisiert sich nicht von selbst.
gcc -std=c11 -Wall -Wextra sample.c -o sample
./sample > sample.ppm
Wechsle zu Postcard Preview, lasse sample.ppm ausgewählt und klicke erneut auf Open postcard. Nur die Vordergrundfarbe sollte sich ändern; Abmessungen und cremefarbene Pixel bleiben gleich.
Meldet das Terminal eine fehlende Datei, kehre mit den bereits erklärten Befehlen cd und ls in den Arbeitsbereich zurück. Meldet die Vorschau, dass die Datei nicht existiert, prüfe in Workspace zuerst die erfolgreiche Kompilierung und führe dann ./sample > sample.ppm aus. Ein Compilerfehler bedeutet, dass keine neue ausführbare Datei gebaut wurde: Korrigiere die angegebene Quelltextzeile und kompiliere erneut.
Ein rechteckiges Muster auf RGB-Pixel abbilden
In diesem Schritt vervollständigst du den Postkartengenerator und öffnest seine tatsächliche Ausgabe.
Beginne in Workspace unter /home/labex/project/postcards. Lies das bereitgestellte Motiv und den unfertigen Generator:
cd /home/labex/project/postcards
cat art.h
cat card.c
#include "art.h" macht diese vorbereiteten Definitionen beim Kompilieren von card.c verfügbar. #define WIDTH 5 und #define HEIGHT 3 geben den Abmessungen Namen. pattern hat drei Zeilen mit jeweils fünf Ziffernzeichen. Jede Zeichenkettenzeile reserviert WIDTH + 1 Zeichen, weil C nach den sichtbaren Zeichen ein Abschlusszeichen mit dem Wert null speichert; die Schleifen verwenden nur die fünf sichtbaren Positionen.
Die erste Zeile, "10000", beginnt mit Palettenfarbe 1 und enthält anschließend vier Pixel der Farbe 0. Das Zeichen '2' ist nicht die ganze Zahl 2. Durch Subtraktion des Zeichens '0' wird eines der bereitgestellten Ziffernzeichen zum Palettenindex: '2' - '0' ergibt 2. Das Motiv enthält nur Ziffern von 0 bis 3, passend zu den vier Palettenzeilen. Lasse Muster, Maße und Farben unverändert. Verwende WIDTH und HEIGHT in den Schleifen, damit die Neukompilierung auch für bereitgestellte rechteckige Muster mit jeweils 1 bis 16 Spalten und Zeilen und denselben Palettenindizes 0 bis 3 funktioniert.
Der unfertige Generator schreibt einen Kopf, aber keine Pixel. Ein Dateikopf allein ist noch kein Bild. Ergänze eine äußere Schleife über y (Zeilen) und eine innere über x (Spalten). pattern[y][x] wählt das Zeichen, palette[c][0..2] dessen RGB-Werte. Die Platzhalter %d in printf geben die ganzzahligen Argumente in der angegebenen Reihenfolge aus.
Verwende den folgenden vollständigen Quelltext. cat > card.c ersetzt diese Datei. <<'EOF' beginnt ein Here-Document: Die Shell kopiert die folgenden Zeilen wörtlich bis zu einer Zeile, die nur EOF enthält. Der in Anführungszeichen gesetzte Begrenzer verhindert Shell-Ersetzungen im C-Quelltext. Kopiere den gesamten Block einschließlich des letzten 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
Kompiliere und erzeuge eine neue Ausgabedatei:
gcc -std=c11 -Wall -Wextra card.c -o card
./card > original.ppm
Das bereitgestellte Prüfwerkzeug dekodiert nur eine Datei; es kann deine Postkarte weder erzeugen noch reparieren. Starte es mit dem Dateinamen als Argument:
python3 /home/labex/.local/share/pixel-postcards/inspect.py original.ppm
Erwartete Ausgabe:
5 x 3 pixels; 15 RGB triples; max value 255
Warum sind diese Zahlen hilfreich? Ein Quadrat könnte vertauschte Maße verbergen. Dieses Muster mit fünf Spalten und drei Zeilen muss breiter als hoch sein und links einen dunklen Streifen haben. WIDTH steuert die innere und HEIGHT die äußere Schleife; ein Vertauschen kann über eine Zeile hinaus zugreifen oder Pixel auslassen.
Wechsle zu Postcard Preview. Klicke auf Refresh files, wähle original.ppm und dann Open postcard. Prüfe den Status 5 × 3 und vergleiche die Zeilen mit art.h. Mit Download PPM speicherst du die echte Bilddatei. Ein Browser lädt PPM möglicherweise herunter, statt es direkt anzuzeigen; verwende diese Vorschau zur Anzeige. Kehre für die Lab-Prüfung zu Workspace zurück.
Der Screenshot zeigt das ausgewählte original.ppm, seine gespeicherten Maße 5 × 3 und Download PPM unter dem Bild. Vergleiche den dunklen Streifen links und alle drei Zeilen.
![]()
Behalte card.c, die ausführbare Datei card, art.h und original.ppm in diesem Arbeitsbereich.
Meldet die Vorschau eine falsche Pixelanzahl, existiert die Datei, ist aber unvollständig: Prüfe beide Schleifengrenzen, speichere card.c, kompiliere erneut und erzeuge original.ppm noch einmal. Die Vergrößerung auf dem Bildschirm ändert die gespeicherten Maße nicht. Im nächsten Lab erzeugst du selbst tatsächlich vergrößerte Bilddateien.
Zusammenfassung
Du hast ein kleines Beispiel kompiliert und umgefärbt und danach ein rechteckiges Zeichenarray auf RGB-Tripel abgebildet. Dein C-Programm erzeugte eine echte P3-Datei, die du dekodiert, betrachtet und heruntergeladen hast. Dabei hast du die Indizierung mit der Zeile an erster Stelle und die Umleitung der Standardausgabe geübt.


