4 Bit-Pixel

In dieser Aufgabe werden immer zwei Pixel in einem Byte komprimiert. Da es nicht mehr als 16 Farben gibt, können immer zwei Pixel zu einem Byte zusammengefasst werden. Dabei bezeichnen die unteren 4 Bits den ersten Pixel, und die oberen 4 Bits den zweiten Pixel:

7 6 5 4 3 2 1 0
2. Pixel 1. Pixel

Die Palette für dieses Bild hat 7 Farben:

0
1
2
3
4
5
6

In dieser Aufgabe wurde das Bild auf 50% der ursprünglichen Größe komprimiert.


Im Gegensatz zur Pixelflut kannst du hier Pixel nicht auf beliebige RGB-Farben setzen, sondern nur einfache, ganze Zahlen als Farben verwenden. Dafür gibt es in jeder Aufgabe eine vordefinierte Palette, die einer Handvoll Zahlen jeweils eine Farbe zuordnet.

Deine Aufgabe ist es, ein codiertes Bild zu decodieren. Die Art der Decodierung ist abhängig von der Aufgabenstellung, die du ganz oben findest (es geht einfach los und wird später schwieriger).

Die codierten Zahlen findest du im Parameter data deiner run-Methode. Für diese Variable stehen dir folgende Methoden zur Vefügung:

next() gibt das nächste Byte zurück
length() gibt die Länge des Datenstroms in Bytes zurück
eof() gibt an, ob wir am Ende des Datenstroms angelangt sind (eof = »end of file«)
reset() springt zurück zum Anfang des Datenstroms
read() liefert alle Bytes in einer Liste zurück

Du kannst also, solange du nicht am Ende des Datenstroms angelangt bist, immer das nächste Byte mit Hilfe der next-Methode lesen und dann dieses Byte untersuchen. Je nach Aufgabenstellung musst du nun aus jedem Byte ableiten, wie viele und welche Pixel du setzen musste. Am Ende soll ein fertiges Bild entstehen.

Um Pixel zu setzen, kannst du die folgende Methode verwenden:

set_pixel(x, y, c) Pixel an Position (x, y) auf Farbe c setzen

Falls du Probleme hast, diese Aufgabe zu lösen, kannst du dir einen Hinweis geben lassen:

1. Hinweis anzeigen

Du kannst Bits aus einem Byte extrahieren, indem du eine UND-Verknüpfung verwendest:

0 1 1 0 1 1 0 1

AND

0 0 0 0 1 1 1 1

=

0 0 0 0 1 1 0 1
2. Hinweis anzeigen

Du kannst also die unteren vier Bits extrahieren, indem du das Byte AND 15 rechnest:

color1 = byte & 15
3. Hinweis anzeigen

Um an die oberen vier Bits zu gelangen, bietet sich der »Shift Right«-Operator >> an, mit dem du Bits nach rechts schieben kannst (das Byte wird dann links mit 0 aufgefüllt).

color2 = (byte >> 4) & 15
from canvas import Canvas

class Task(Canvas):
    def run(self, data, width, height):
        # Ersetze 'pass' durch deine Lösung
        pass
Impressum und Datenschutz