Luna Picture (*.lp)
Das Luna-Picture-Format ist ein propritäres Bildformat, welches direkt von der IDE mit einem Editor/Konverter unterstützt wird. Durch den simplen Aufbau eignet es sich für die Verwendung in Mikrocontroller-Anwendungen.
Man kann jedoch natürlich jedes andere Format in seine Programme einbinden und mit einer entsprechenden Dekodierungsroutine verarbeiten. Beispielsweise unterstützt das Standard-Windows-Format „bmp“ ebenfalls RLE-Kompression und eine Farbtiefe bis 24 Bit. Eine weitere Alternative ist „png“, wobei hier jedoch aufwändigere Dekodierungsroutinen notwendig werden.
Im Gegensatz zum im Mikrocontroller-Bereich bekannten „BGF“-Format, führt es nicht zu Dekodierungsfehlern wenn bestimmte Byte-Folgen im Bild auftreten. Zudem besitzt es eine Endmarkierung.
Formatbeschreibung
Das Luna-Picture-Format besteht aus einem Header, den mit RLE gepackten Daten und einer Endmarkierung.
Offset | Beschreibung | Name |
---|---|---|
0x00 | Breite in Pixel | Width |
0x01 | Höhe in Pixel | Height |
0x02 | Bittiefe (1) | Depth |
0x03 | unbelegt/reserviert (0) | reserved |
0x04..n | RLE-Komprimierte Bilddaten | Data |
0x77:0x00 | Endmarkierung (2-Byte-Token) | EndMark |
Die Bilddaten: Erster Pixel ist an Position links oben (x=0,y=0)
- 1Bit: Jedes Byte speichert 8 Pixel x,y+0..7 (bit)
- 8Bit: Jedes Byte speichert 1 pixel x,y (byte)
Die RLE-Kodierung
Man liest ein Byte und prüft ob es sich um den Wert 0x77 handelt (Magic-Byte). Dieses markiert den Beginn eines 3-Byte-Tokens: 0x77:count:value, Beispiel: Für „0x77 0xFF 0x13“ ist 255 x der Wert 0x13 einzusetzen. Das wars auch schon und das ist wohl auch der einzige Vorteil dieses simplen Formats: Einfach und und vor allem schnell auf Mikrocontrollern zu verarbeiten.
Beispiel-Dekodierungsroutine
' Initialisierung avr.device = atmega168 avr.clock = 20000000 ' Quarzfrequenz avr.stack = 32 ' Bytes Programmstack (Vorgabe: 16) uart.baud = 19200 ' Baudrate uart.Recv.enable ' Senden aktivieren uart.Send.enable ' Empfangen aktivieren ' Hauptprogramm BildSenden(Bild.Addr) ' Bild dekodieren und auf serieller Schnittstelle ausgeben do loop Procedure BildSenden(imgAddr as word) dim i,a,cc as byte dim c,w,h,size as word ' RLE compressed luna lcd picture (bulled proof) ' format description ' -- header (4 bytes) ------------------ ' byte width in pixel ' byte height in pixel ' byte depth (1,8) ' byte reserved (0) ' -- data (x bytes) -------------------- ' First pixel ist left top x=0,y=0 ' 1 bit: pixels scanned from x to x+width-1 and 8 rows per width ' each byte contains 8 pixel x,y+0..7 (bit) ' 8 bit: pixels scanned from x to x+width-1 and 1 row per width ' each byte contains 1 pixel x,y (byte) ' RLE: magic = 0x77:count:value (3-byte token) ' example: 0x77 0xFF 0x13 is 255 x the value 0x13 ' -- end mark -------------------------- ' 0x77 0x00 (zero count, no value byte) ' routine for monochrome pictures w = flash.ByteValue(imgAdr) incr imgAdr h = flash.ByteValue(imgAdr) add imgAdr,3 size = h / 8 size = size * w decr size clr c do a = flash.ByteValue(imgAdr) incr imgAdr if a = &h77 then cc = flash.ByteValue(imgAdr) if cc then incr imgAdr a = flash.ByteValue(imgAdr) incr imgAdr for i = 1 to cc Uart.Write a incr c next else exit end if else Uart.Write a incr c end if loop until c > size or c > 1023 endproc EndProc #includeData Bild,"pictures\meinbild.lp"