Micht stört schon seit längerem die Umständlichkeit der Vorgehensweise, aus irgendwelchen Bildern brauchbare Texturen zu machen, die in meinen eigenen Programmen verwendet werden können. Insbesondere ist es immer einigermaßen langwierig, z.B. aus JPEGs gute Billboards zu machen, da man, dank verlustbehaftetem Format, schlecht mit ColorKeys arbeiten kann und immer Toleranzgrenzen verwenden muss - die entsprechenden Einstellungen sind denn in meiner Bildbearbeitung der Wahl (Photoline, weil es schön schnell startet) auch nicht ganz intuitiv zu finden.
Aus diesem Grund habe ich mich die letzten zwei Abende hingesetzt und den TGA Builder gebastelt: dieses Progrämmchen startet in der linken oberen Ecke des Bildschirms, von wo aus einfach (fast) beliebige Bilddateien drauf gezogen werden können. Klickt man dann in die Miniaturansicht, oder die Bildvorschau, wird über die entsprechende Farbe ein Alphakanal berechnet, wobei die beiden Scrollbars a) die Toleranzgrenze festlegen und b) es ermöglichen Bildränder stufenlos in den Hintergrund überzublenden.
TGA Builder rechnet die Bildgröße automatisch in OpenGL texturtaugliche Zweierpotenzen um, wobei erstmal eine Größe vorgeschlagen wird, bei der keine Informationen verloren gehen, die endgültige Größe kann mittels Klicks auf die entsprechenden Buttons schnell festgelegt werden. Bei der Umrechnung von Größen wird ein guter Filter verwendet, der auch den Alphakanal berücksichtigt, damit möglichst wenig Informationen verlorengehen.
Mit der rechten Maustaste kann man das resultierende Bild in der Miniaturansicht oder der Bildvorschau (deren Fenster beliebig vergrößerbar ist) auch noch zurechtschneiden, sodass in vielen Fällen keine weiteren Tools zur Nachbearbeitung diverser Internetressourcen notwendig sein sollten.
Der Name TGA Builder ergibt sich übrigens daraus, dass das Programm generell nur unkomprimierte 32 Bit TGAs (RGBA) erstellt, die den Vorteil haben, dass sie sehr einfach geladen werden können. Eine entsprechnde Routine ist z.B. weiter unten zu finden.
Und hier gibt es das Programm
http://www.basegraph.com/bg/instpack/tgabuilder.zip
Code: TRGBA = packed record r: byte; g: byte; b: byte; a: byte; // align rgb for windows bitmaps end; PRGBA = ^TRGBA; TRGBAs = array[0..4096*4096] of TRGBA; // reserve enough space PRGBAs = ^TRGBAs; TRGBAImage = record width: integer; height : integer; data : PRGBAs; end; PRGBAImage = ^TRGBAImage; TTGAHeader = packed record idlength : byte; colourmaptype : byte; datatypecode : byte; colourmaporigin : smallint; colourmaplength : smallint; colourmapdepth : byte; x_origin : smallint; y_origin : smallint; width : smallint; height : smallint; bitsperpixel : byte; imagedescriptor : byte; end; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // 32 bit TGA image loader // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function LoadTGAImage(FileName : String) : PRGBAImage; var Header : TTGAHeader; F : File; img : PRGBAImage; l : integer; h : byte; begin img := NIL; if IOResult<>0 then ; // clear IOResult Assign(F, FileName); Reset(F, 1); if IOResult=0 then begin BlockRead(F, Header, SizeOf(Header)); with Header do if (datatypecode=2) and (bitsperpixel=32) then begin Seek(F, SizeOf(Header) + idlength + colourmaptype * colourmaplength); New(img); img.width := width; img.height := height; l := img.width * img.height; GetMem(img.data, l * 4); BlockRead(F, img.data^, l * 4); repeat dec(l); with img.data^[l] do begin h:=r; r:=b; b:=h; end; until l=0; end; Close(F); end else begin New(img); img.width := 16; img.height := 16; GetMem(img.data, 1024); FillChar(img.data^, 1024, $FF); end; result := img; end;
|