studyklar
GdI 1 · Übungsblatt 7 · Aufgabe 3

Pixelblock 8 × 8: Negativ, um 180° und um 90° drehen

Ein kleines Graustufenbild besteht aus 8 × 8 Bildpunkten, den Pixeln. Jedes Pixel hat eine Helligkeit von 0 (schwarz) bis 255 (weiß). Drei Programme machen daraus ein Negativ, eine Drehung um 180° und eine Drehung um 90°. Die ganze Arbeit steckt in einer Frage: Welches Pixel landet auf welchem Platz? Rechts stehen Bild und Ergebnis mit Grauton und Zahl. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 7.3

In der Datei eingabe73.txt sind die Helligkeitswerte eines 8x8-Pixelblocks gespeichert. Die Helligkeitswerte liegen im Bereich 0 (schwarz) bis 255 (weiß).

a) Schreiben Sie ein Programm A7_3a, welches das Negativ des gegebenen 8x8-Pixelblocks berechnet und in die Datei ausgabe73a.txt ausgibt. Mit Negativ ist der seitenverkehrte Pixelblock (nur rechts-links-vertauscht) mit komplementären Helligkeitswerten gemeint. Beispielsweise ist „weiß“ komplementär zu „schwarz“, d. h. aus dem Helligkeitswert 255 wird 0 und umgekehrt. Ebenso wird z. B. aus 200 der Wert 55 usw.

b) Schreiben Sie ein Programm A7_3b, welches den gegebenen 8x8-Pixelblock um 180° dreht und das Ergebnis in die Datei ausgabe73b.txt ausgibt.

c) Schreiben Sie ein Programm A7_3c, welches den gegebenen 8x8-Pixelblock im Uhrzeigersinn um 90° dreht und das Ergebnis in die Datei ausgabe73c.txt ausgibt.

Die 64 Helligkeiten stehen in der Datei eingabe73.txt, Zeile für Zeile. Jedes Programm liest sie in ein Array mit 8 Zeilen und 8 Spalten, baut daraus ein neues Bild und schreibt es in eine eigene Ausgabedatei.

  • a) Negativ: links und rechts tauschen und jede Helligkeit umkehren, 200 wird 55.
  • b) Das Bild auf den Kopf stellen, also um 180° drehen.
  • c) Das Bild um 90° im Uhrzeigersinn drehen.

Annahme: Die Datei eingabe73.txt liegt nicht vor. Unsere eigene Datei zeigt ein schwarzes „F“ auf weißem Grund mit grauen Ecken. Ein „F“ sieht nach jedem Spiegeln und Drehen anders aus; daran erkennt man sofort, ob ein Programm richtig arbeitet.

Merke: Für jedes Pixel des Ergebnisses q[i][j] fragt man: Von welchem Platz in p kommt es? Die Antwort ist eine Formel für die Indizes.
  1. a) Die Eingabedatei festlegen und einlesen.
  2. a) Spiegeln: Spalte j kommt von Spalte 7 − j.
  3. a) Komplement: 255 minus Helligkeit.
  4. a) Das Ergebnis in die Datei schreiben.
  5. b) 180°: Zeile und Spalte spiegeln.
  6. c) 90°: aus einer Zeile wird eine Spalte.

Die Eingabedatei eingabe73.txt

Datei eingabe73.txt (unsere Werte):

150 0 0 0 0 0 255 200
255 0 255 255 255 255 255 255
255 0 255 255 255 255 255 255
255 0 80 80 80 255 255 255
255 0 255 255 255 255 255 255
255 0 255 255 255 255 255 255
255 0 255 255 255 255 255 255
100 0 255 255 255 255 255 50

Die Datei enthält 8 Zeilen mit je 8 Zahlen, getrennt durch Leerzeichen. Die erste Zeile der Datei ist die oberste Bildzeile, die erste Zahl darin das Pixel links oben.

Unsere Werte: Das „F“ ist schwarz (0), sein mittlerer Balken dunkelgrau (80). Der Grund ist weiß (255). Die vier Ecken haben eigene Grautöne: 150 links oben, 200 rechts oben, 100 links unten, 50 rechts unten. An ihnen sieht man später, wohin jede Ecke wandert. Die Datei liegt im selben Ordner wie das Programm.

Den Pixelblock in ein zweidimensionales Array lesen

public class A7_3a {     public static void main(String[] args) {        int[][] p = new int[8][8];         In.open("eingabe73.txt");        for (int i = 0; i < 8; i++) {            for (int j = 0; j < 8; j++) {                p[i][j] = In.readInt();            }        }        In.close();

Ein Bild hat Zeilen und Spalten. Dazu passt ein zweidimensionales Array: int[][] p = new int[8][8] hat 8 Zeilen mit je 8 Plätzen. p[i][j] ist das Pixel in Zeile i und Spalte j, beide von 0 bis 7. p[0][7] ist also rechts oben.

Zwei Schleifen ineinander lesen die 64 Zahlen. Die äußere geht die Zeilen i durch, die innere in jeder Zeile die Spalten j. So kommen die Zahlen in derselben Reihenfolge an, in der sie in der Datei stehen: erst Zeile 0 von links nach rechts, dann Zeile 1 und so weiter.

Aus Blatt 7, Aufgabe 1 („Array rückwärts ausgeben: erst Tastatur, dann Datei“): In.open("datei.txt") lenkt In.readInt() auf die Datei um, In.close() schließt sie wieder; Out.open und Out.close tun dasselbe für die Ausgabe. In und Out sind Hilfsklassen der Vorlesung; In.java und Out.java liegen im selben Ordner wie das Programm.
Aus Skript 5, Folien 5-15 und 5-17 („Mehrdimensionale Arrays“, „Pixelgrafik“): Ein zweidimensionales Array ist in Java ein Array von Zeilen. new int[4][3] erzeugt 4 Zeilen mit je 3 Spalten, der Zugriff lautet a[i][j].
Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1a) Negativ

seitenverkehrt und komplementär

p (eingabe73.txt)
i\j
0
1
2
3
4
5
6
7
0
150
0
0
0
0
0
255
200
1
255
0
255
255
255
255
255
255
2
255
0
255
255
255
255
255
255
3
255
0
80
80
80
255
255
255
4
255
0
255
255
255
255
255
255
5
255
0
255
255
255
255
255
255
6
255
0
255
255
255
255
255
255
7
100
0
255
255
255
255
255
50
q (ausgabe73a.txt)
i\j
0
1
2
3
4
5
6
7
0
?
?
?
?
?
?
?
?
1
?
?
?
?
?
?
?
?
2
?
?
?
?
?
?
?
?
3
?
?
?
?
?
?
?
?
4
?
?
?
?
?
?
?
?
5
?
?
?
?
?
?
?
?
6
?
?
?
?
?
?
?
?
7
?
?
?
?
?
?
?
?
LegendePixelblock p und das Ergebnis q, Zahl und Grauton je Pixel.