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"