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