Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem beim laden einer LCD Animation als Bitmap (https://www.delphipraxis.net/67188-problem-beim-laden-einer-lcd-animation-als-bitmap.html)

scp 10. Apr 2006 23:40


Problem beim laden einer LCD Animation als Bitmap
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mal versucht ein Dateiformat einzulesen und auf die Pixels eines Bitmaps zu übertragen.
Das geht in diesem Fall recht einfach, da die Datei ähnlich wie ein monochromes Bitmap aufgebaut ist.
Die Datei hat einen Header von 16 Byte:
Delphi-Quellcode:
type
  ani_header = packed record
    Magic: DWORD; // Immer "LCDA" = $4144434C
    Format: Word; // Zurzeit einfach 0000
    Width: Word; // Breite Einzelbild
    Height: Word; // Höhe Einzelbild
    Count: Word; // Anzahl Einzelbilder
    Delay: DWORD; // Veruögerung der Einzelbilder in Mikrosekunden (1 Millionenstel Sek.)
  end;
Dann folgen die Daten, in meinem Fall haben die Bilder immer eine Auflösung von
120x64 Pixel = 120 Spalten x 8 Zeilen x 8 Bit = 960 Byte
Soweit, sogut. Habe auch schon Code zum Übertragen auf die Pixelmatrix, aber irgendwas stimmt nicht. In Zeile 8, Zeile 16, 24 usw. sind immer alle Pixel 1 = hell, was eine Streifen im Bild verursacht, hat einer ne Idee warum?

Anbei ein Testprojekt.

PS: Es geht im Prinzip nur um den Code von LoadLCDAniFromStream(), der Rest ist nur zum testen.
PPS: Die Bilder an sich sind grobkörnig, weil monochrom, die Streifen sind trotzdem gut zu erkennen, z.B. bei Bild 14.

scp 11. Apr 2006 00:17

Re: Problem beim laden einer LCD Animation als Bitmap
 
Habs doch noch gefunden :-) :
Delphi-Quellcode:
procedure LoadLCDAniFromStream(Stream: TStream; index: integer; Bmp: TBitmap);
var
  LCDAHeader: TLCDAHeader;
  buf: packed array[0..LCD_ROWS-1,0..LCD_COLS-1] Of Byte;
  pix: Word;
  x,y: integer;
begin
  If (Stream.Size >= SizeOf(LCDAHeader)+index*LCD_BUFFER_SIZE) then
  begin
    Stream.Read(LCDAHeader, SizeOf(LCDAHeader));

    Stream.Seek((index-1)*SizeOf(buf), soFromCurrent);
    Stream.Read(buf, SizeOf(buf));

    for y := 0 to LCD_ROWS*8-1 do
      for x := 0 to LCD_COLS-1 do
      begin
        pix := (buf[y shr 3][x] shr (y and 7)) and 1;
       
        If Pix = 0 then
          Bmp.Canvas.Pixels[x, y] := clLCDBack
        else
          Bmp.Canvas.Pixels[x, y] := clLCDFront;
        end;
   end;
end;
Quelle:
http://cvs.tuxbox.org/cgi-bin/viewcv...tapps/bmp2raw/
(aus packed2raw() in raw.c)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz