Einzelnen Beitrag anzeigen

psycore

Registriert seit: 16. Sep 2006
Ort: Österreich
11 Beiträge
 
#1

Problem beim Laden von TGA's

  Alt 16. Sep 2006, 18:17
Hey Leute!


Also ich bin grade dabei eine Lösung zu finden wie ich TGA's in ein TBitmap laden kann. Wichtig ist dass es sich hierbei nur um TGA's vom Typ 2, also unkomprimierte RGB Bilder mit einer Auflösung von 256x256 und 32 Bit handelt. Das Auslesen des Headers bis zur eigentlichen Bildinformation klappt auch schon einigermaßen.

Hier mal der Anfang des Quellcodes:

Delphi-Quellcode:
procedure TMainForm.LoadTGA(stream: TStream);
var
  height, width: Word;
  TGAFormat, TGAbpp, TGAColors, TGAid: Byte;
  OffScreen: TBitmap;
  i, i2: integer;
  testbmp: TRGBValue;
begin
  OffScreen := TBitmap.Create;
  OffScreen.Height := 256;
  OffScreen.Width := 256;

  stream.seek(0, soFromCurrent);
  stream.ReadBuffer(TGAid, 1); //Länge des Image Identification Field auslesen
  stream.seek(1, soFromCurrent); //Color Map Type überspringen
  stream.ReadBuffer(TGAFormat, 1); //format lesen, diente nur zu testzwecken, bild muss format 2 sein
  stream.seek(9, soFromCurrent); //9 überspringen
  stream.ReadBuffer(width, 2); //breite auslesen, auch nur zum testen
  stream.ReadBuffer(height, 2); //höhe auslesen
  stream.ReadBuffer(TGAColors, 1); //32 bit
  stream.seek(1, soFromCurrent); //1 überspringen

  Showmessage('Länge des Image Identification Field: ' + IntToStr(TGAid));
  Showmessage('Höhe: ' + IntToStr(y) + ', Breite: ' + IntToStr(x) + ' pixel.');
  Showmessage('Typ: ' + IntToStr(TGAFormat));
  Showmessage('Pixelformat: ' + IntToStr(TGAColors)); //mal alle infos ausgeben, nur zur sicherheit ;)


  TGAbpp := ((TGAColors + 7) shr 3); //4 bytes per pixel

  Showmessage('TGA bytes per pixel: ' + IntToStr(TGAbpp)); //auch mal ausgeben

  OffScreen.PixelFormat := pf24Bit;
So, soweit so gut. Das Problem ist nun dass ich 4 bytes pro pixel hab. Das heißt eins für Blau, eins für Grün, eins für Rot und noch eines mit irgend einem Attribut, was das genau ist hab ich noch nicht rausgefunden

Ich hab jetzt einfach mal um zu sehen ob ich überhaupt die Farben richtig auslesen kann die seeeeeehr lahme Methode gewählt:

Delphi-Quellcode:
type TRGBValue = record
  Blue: Byte;
  Green: Byte;
  Red: Byte;
end;


  //--------------------------
  //Seeeeehr lahme methode!!!
  //--------------------------
  
  for i := 0 to 255 do
  for i2 := 0 to 255 do
  begin
  stream.ReadBuffer(testbmp.blue, 1);
  stream.ReadBuffer(testbmp.green, 1);
  stream.ReadBuffer(testbmp.red, 1);

  //Showmessage('Rotwert: ' + IntToStr(testbmp.red));
  //Showmessage('Blauwert: ' + IntToStr(testbmp.blue));
  //Showmessage('Grünwert: ' + IntToStr(testbmp.green)); //Zu testzwecken, bei 65536 Pixeln aber nicht ratsam ;)

  OffScreen.Canvas.Pixels[i, i2] := RGB(testbmp.red, testbmp.green, testbmp.blue); //In TColor umwandeln
  stream.Seek(1, soFromCurrent); //das 4 "attribute" byte überspringen
  end;


  GOutput.Canvas.Draw(0, 0, OffScreen); //Und auf die Form zeichnen

  OffScreen.Free;
end;

Soooo und hier meine Frage:

Wie soll ich das mit Scanline bewerkstelligen, also mit dem 4ten Byte? Habt ihr da ne Idee? (bestimmt )

Danke schonmal,

psycore


PS: Ja ich weiß dass das Bild noch verdreht ist
  Mit Zitat antworten Zitat