Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TGA Dateiformat


catweasel - Sa 07.06.14 14:07
Titel: TGA Dateiformat
Hi,

Ich bin gerade dabei meine TGA Komponente mit einer SaveToFile() Methode auszustatten. LoadFromFile klappt ja schon.
Zunächst scheint ds sehr simpel zu sein. Den header erstelen und dann zusammen mit den Daten in eine Datei schreiben.

Dummerweise muss man dazu wissen wie der Header aufgebaut ist. Die Header Feldpositionen zum lesen hatte ich aus einem Tutorial das nur den Lesezugriff behandelt hat und deshalb den Header nicht vollständig erklärt hat.
Also hab ich mal im Internet geschaut. Der link bei wozit zum TGA Format funktioniert leider nicht. Der nächstbeste Treffer war Wikipedia (natürlich :) )
http://de.wikipedia.org/wiki/Targa_Image_File
Also hübsch einen header record gedrechselt und mal versucht das Testfile (von dem ich ja weiss das es einen gültigen Header hat) zu laden.
Irgendwie geht es da aber gewaltig daneben. :?

Ich bekomme:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
ImgageIDLen: 0
HasImgageID: 0
ImageType: 2
PalBegin: 0
PalLen: 0
PalBitDepth: 0
MapXZero: 0
MapYZero: 512
ImgWidth: 512
ImgHeight: 2080
PixelBitDepth: 0
ImgAttributes: 0


Also entweder hab ich in meinem Header record etwas vergessen, oder der Wikipedia Artikel stimmt so nicht ganz.... :?:
Die ersten drei Werte scheinen ja ok zu sein. Dann kommen die Nullen für Origin X/Y (laut WP standardmäßig Null)
Da muss irgendetwas fehlen da die Bildbreite/höhe um genau ein wert versetzt ist.
Entweder ist da was ein word wo WP sagt es wäre ein byte oder so etwas..
Und 2080 ist auch sicher nicht die PixelDepth.

Endlich habe ich dann die Orginal SPecs gefunden : http://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf
Aber da steht es eigentlich genauso ... :?:

Das Testbild habe ich mit Photoshop erzeugt.

Die aktuelle Version ist zum Rumprobieren angehängt :)
(Der button "read header" liest nur den Header aus. Es wird kein objekt erzeugt.)

Cheers,
Catweasel


Martok - Sa 07.06.14 16:31

Targa ist ein tolles Format. Da kriegt man echt alles rein :lol:

Du könntest dir das mal in der glBitmap [http://git.delphigl.com/?p=glBitmap.git;a=blob;f=glBitmap.pas;h=b1b4c65417bfb803c53838222c924bd9eb7c17f7;hb=HEAD#l7468] angucken, die implementiert (spätestens nach user profile iconBergmann89s Rewrite) so ziemlich alles was das Format kann. Ich meine mich erinnern zu können, dass er damals bei irgend einem Format viel geflucht hatte weil die Doku überall falsch war. Könnte das gewesen sein ;) {€: wars nicht, das war DDS}


catweasel - Sa 07.06.14 16:47

Hey Martok,

Vielen Dank :D
Das Problem hat sich tatsächlich gelöst. Eigentlich ein Anfängerfehler:
Ich hatte bei der record definition des Headers das "packed" vergessen.
Ein Blick in den verlinken Code und schon isses ins Auge gesprungen :)
Nun wird der Header korrekt gelesen :)

Sollte es noch Probleme geben meld ich mich nochmal.

Cheers,
Catweasel