![]() |
Problem beim Laden von TGA's
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:
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 :gruebel:
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; 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 :stupid: ) Danke schonmal, psycore PS: Ja ich weiß dass das Bild noch verdreht ist :P |
Re: Problem beim Laden von TGA's
Einfach so machen:
Delphi-Quellcode:
Dann kannst du auch so lesen:
type TRGBAValue = record
case Integer of 1: (Value: Cardinal); 2: (Alpha, Blue, Green, Red: Byte); end;
Delphi-Quellcode:
mystream.Read(myRGBAValue, sizeof(TRGBAValue));
|
Re: Problem beim Laden von TGA's
Erstmal danke für die fixe antwort aber könntest du das für mich ein wenig genauer ausführen? Ich verstehs nämlich nicht ganz :roll:
:dp: |
Re: Problem beim Laden von TGA's
Naja... was gibts da noch zum ausführen? Mit diesem varianten Record kannst du auf die einzelnen Pixel deiner TGA-Datei zugreifen. Aus dem Header bekommst du Höhe und Breite, hoffe ich mal. du kannst das z.B. so umsetzen:
Delphi-Quellcode:
damit füllst du ein bitmap (das dir richtigen maße hat) mit dem tga-bild, allerdings ohne transparenz (die könntest du mit
for y := 0 to tgaheight-1 do
for x := 0 to tgawidth-1 do begin pixelpos := bitmap.scanline[0] + Pointer(y * height + width); tgastream.read(tgapixel, sizeof(tgapixel)); //typeof(tgapixel) = TRGBAValue TRGBTriple(pixelpos^).red := tgapixel.red; //etc. für grün und blau; ob TRGBTriple da jetzt richtig ist, weiß ich nicht, hab das mal genommen. end; ![]() |
Re: Problem beim Laden von TGA's
am besten einfach die Farbtiefe des Bildes/Bitmaps auf 32bit (pf32bit) setzen. Dann ist ein Pixel dort auch 4 Byte groß. Zudem ist das 4te Byte der Alphakanal
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz