JavaScript kann auch Rastergrafiken auf den Bildschirm einer Bangle.js bringen diese können
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ührenAus den drei Pacman-Grafiken lässt sich sogar eine kleine Animation basteln.
im Emulator ausführen auf Uhr ausführenEtwas platzsparender (obgleich weniger komfortabel) ist, eine Bitmap gleich in Binärform anzugeben.
im Emulator ausführen auf Uhr ausführenIn 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":
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 können während des Zeichnens auch skaliert und rotiert werden:
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.
Auf der Uhr des Autors dauert das Füllen des Bildschirmes mit dem gezeigten Muster ca. 874ms.
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
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!
Das zugrundeliegende Funktionsprinzip ist recht einfach:
btoa
in Text umgewandelt, an eine angeschlossene Uhr übertragen und dort in eine Datei geschrieben.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,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
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();
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) |