Andreas Rozek
[ Impressum ]   [ Datenschutzerklärung ]   [ Kontakt ]   [ ]

Rastergrafiken

Bangle.js Rastergrafiken

JavaScript kann auch Rastergrafiken auf den Bildschirm einer Bangle.js bringen diese können

  • innerhalb des Programmes aus einer Art ASCII-Grafik erzeugt bzw. binär vorgegeben,
  • aus der Ausgabe des Espruino Image Converter generiert oder
  • vom Dateisystem geladen werden.

Bitmaps aus ASCII-Grafiken

Rastergrafiken mit einer Farbtiefe von einem Bit können aus einer Art ASCII-Grafik erzeugt werden. Gesetzte Bits werden dann in der Vordergrund-, nicht gesetzte Bits in der Hintergrundfarbe auf den Bildschirm gezeichnet. Diese Vorgehensweise funktioniert in allen LCD-Modi.

im Emulator ausführen auf Uhr ausführen
im Emulator ausführen auf Uhr ausführen
240x240
120x120

Aus den drei Pacman-Grafiken lässt sich sogar eine kleine Animation basteln.

im Emulator ausführen auf Uhr ausführen

binär vorgegebene Rastergrafiken

Etwas platzsparender (obgleich weniger komfortabel) ist, eine Bitmap gleich in Binärform anzugeben.

im Emulator ausführen auf Uhr ausführen

Verwendung des Espruino Image Converter

In den meisten Fällen dürfe man bereits fertige Rastergrafiken vorliegen haben und deshalb vor dem Problem stehen, diese auf eine Bangle.js zu bringen.

Espruino stellt zu diesem Zweck einen Image Converter zur Verfügung, der gegebene Bitmaps in eines der von Bangle.js unterstützten Formate umwandelt und als JavaScript-Anweisung ausgibt - diese Anweisung muss nun nur noch in das eigenen Programm eingefügt werden.

Es folgen Beispiele für die verschiedenen Farbtiefen einer Bangle.js - bitte beachten Sie auch die jeweiligen Einstellungen für den "Image Converter":

  • Farbtiefe 1 Bit (schwarz/weiß bzw. Vorder- und Hintergrundfarbe)

    im Emulator ausführen auf Uhr ausführen
    80x80
  • Farbtiefe 4 Bit (16 Farben)

    im Emulator ausführen auf Uhr ausführen
    80x80
  • Farbtiefe 8 Bit (Web-Palette mit 216 Farben)
     

    im Emulator ausführen auf Uhr ausführen
    80x80
  • Farbtiefe 16 Bit (RGB565-kodiert, 65536 Farben)
     

    im Emulator ausführen auf Uhr ausführen
    240x240

    Rastergrafiken mit einer Farbauflösung von 16 Bit stellen für die Bangle.js eine große Herausforderung dar, weil sie (im Vergleich zu den insgesamt verfügbaren 64kB) einfach immens viel Speicher benötigen. Das gezeigte Bild mit einer Größe von 60x60 Pixel kann von der Uhr jedoch noch verarbeitet werden.

Rastergrafiken skalieren und rotieren

Rastergrafiken können während des Zeichnens auch skaliert und rotiert werden:

  • Skalierung
     im Emulator ausführen auf Uhr ausführen
    240x240
  • Rotation
     im Emulator ausführen auf Uhr ausführen
    240x240

Hintergrund mit Muster füllen

In den hohen Auflösungen reicht der Hauptspeicher einer Bangle.js nicht aus, um ein komplettes Hintergrundbild zu laden und anzuzeigen.

Sofern der Hintergrund jedoch eine periodische Textur besitzt, ist es möglich ihn aus diesen kleineren Kacheln zu parkettieren.

240x240

 im Emulator ausführen auf Uhr ausführen

Auf der Uhr des Autors dauert das Füllen des Bildschirmes mit dem gezeigten Muster ca. 874ms.

Rastergrafiken in voller Bildschirmauflösung

Der Bildschirm einer Bangle.js bietet im Prinzip 240x240 Pixel mit einer Farbauflösung von 16 Bit - da wäre es doch schade, wenn es nicht gelänge, diese Fähigkeit auch auszunutzen!

Die folgenden Abschnitte zeigen, wie man

  • eine Rastergrafik in dieser Auflösung auf eine Bangle.js überträgt und
  • diese Rastergrafik dort zur Anzeige bringt.

Auf der Uhr des Autors dauert das Zeichnen eines solchen Bildes etwa 2.2 Sekunden - das Ergebnis entschädigt aber für diesen (Zeit-)Aufwand!

Funktionsprinzip

Das zugrundeliegende Funktionsprinzip ist recht einfach:

  1. zunächst wird (auf einem PC) eine vorhandene Bilddatei der Größe 240x240 oder 240x160 Pixel RGB565-farbkodiert, anschließend Zeile für Zeile mittels btoa in Text umgewandelt, an eine angeschlossene Uhr übertragen und dort in eine Datei geschrieben.
  2. Auf der Uhr selbst wird die Datei nun zeilenweise gelesen sowie jede Zeile mittels atob wieder in Binärdaten konvertiert, daraus ein Image-Objekt erzeugt und dieses Image an passender Stelle auf den Bildschirm gezeichnet.

Diese umständliche Vorgehensweise ist erforderlich, weil

  • Storage.read entgegen der Dokumentation eben doch keine großen Dateien verkraftet,
  • segmentierte Dateien aber keine binären Daten vertragen (das Lesen der Datei würde nach dem ersten Byte mit dem Wert 0xFF abbrechen).

Rastergrafik auf Bangle.js übertragen

Die JavaScript-Anweisungen, mit denen eine große Bilddatei (in RGB565-Kodierung) von einem PC aus auf eine angeschlossene Uhr übertragen werden kann, lauten im Prinzip:

reset(); // important!

let File = require('Storage').open('FileName','w');
File.write('encoded pixel line\n');
repeat for all remaining pixel lines

Sofern Ihr gerade benutzter Browser Web-Bluetooth unterstützt, nimmt Ihnen das folgende Formular die mühevolle Prozedur der Bild-Übertragung ab: ziehen Sie einfach die gewünschte Grafikdatei (in den Größen 240x240 oder 240x160 Pixel) auf das dafür vorgesehene Feld - das Bild wird dann passend kodiert und auf eine angeschlossene Uhr übertragen.

Der Dateiname auf dem Dateisystem der Bangle.js wird aus den ersten 7 druckbaren ASCII-Zeichen des ursprünglichen Dateinamens gebildet - Steuerzeichen, Leerzeichen und Nicht-ASCII-Zeichen werden also ignoriert.

Die für die Übertragung erforderliche Bluetooth-Verbindung wird automatisch aufgebaut.

Status: choose the image to be sliced and uploaded

Rastergrafik auf Bangle.js anzeigen

Die soeben übertragene Bilddatei zur Anzeige zu bringen, ist erstaunlich einfach:

const Storage = require('Storage');

Bangle.setLCDMode();
g.clear();

let ImageFile = Storage.open('image file name','r');
for (let y = 0; y < 240; y++) {
let LineData = ImageFile.readLine();
if (LineData == null) { break }

g.drawImage({
width:240, height:1, bpp:16, transparent:0,
buffer:E.toArrayBuffer(atob(LineData))
}, 0,y);
}
g.flip();

Beispiel

Als Beispielbild soll die auf 240x240 Pixel verkleinerte Version der häufig für solche Zwecke eingesetzten "Lena" dienen (einem Scan aus einer Ausgabe der Zeitschrift "Playboy", welcher ausnahmsweise frei verwendet werden darf)

Testbild

Download
         Anzeige im Emulator (RGB565-kodiert)
240x240

     (manchmal leicht grünstichig)