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"