Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Hallo,
ich will mit Lossy's glBitmap eine Textur laden, und diese dann in ein Delphi Bitmap speichern.
Dabei gehe ich wie folgt vor:
Code:
b := TBitmap.Create;
glbmp := TglBitmap2D.Create;
glbmp.LoadFromStream(MyStream);
glbmp.AssignToBitmap(b);
glbmp.Free;
Image1.Picture.Bitmap.Assign(b);
b.Free;
Diese Vorgehensweise funktioniert einwandfrei, jedoch nur bei bmp- und jpg-Dateien.
Wenn ich eine tga-Datei lade, die transparent Informationen besitzt, sieht das resultierende
Delphi Bitmap sehr komisch aus (siehe Anhang).
Gibt es eine Möglichkeit (wenn möglich mit einer Funktion der glBitmap Unit) den Alpha-Kanal beim AssignToBitmap Vorgang eine bestimmte Farbe zuzuweisen (z.B. weiss)?
@Anhang:
Es scheinen irgendwie noch Bildinformationen (rgb-Werte) zu existieren bei denen alpha=0 ist,
diese werden mit 'exportiert'.
Vielen Dank für jede Hilfe.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
In Gimp kannst du zum Beispiel die Ebenenmaske deaktivieren. Wenn du das tust wirst du sehen, dass das Ergebniss genau das Gleiche ist. Denn leider gehen die Grafikprogramme davon aus, dass der "unsichtbaren" Pixel nicht benutzt wird. Was aber nun mal nicht immer stimmt. Speziell bei Texturen kann so etwas schon mal leicht passieren. Außerdem unterstützen Bitmaps offiziell keinen Alphakanal wodurch dieser auch gerne mal schnell verschwindet. Und dann kommen nur die RGB Werte zum Vorschein. Also Falsch is das zweite Bild nicht.
Du kannst versuchen das entweder im Gimp zu lösen und zwar in dem du die Farbe schwarz in der Ebenenmaske selektierst und dann auf der Ebene wechselst und den Bereich mit Schwarz füllst. Dann als TGA speichern und wenn du Glück hast ist es dann auch schwarz.
Wenn das nicht wirkt kannst du auch die Daten nach dem Laden anpassen. Speziell auch für so etwas hatte ich ja eine Funktionsschnittstelle eingebaut. Aber das ist in jedem Falle langsamer als es im Gimp zu realisieren bzw muss man nicht so weit ausholen, wenn es auch einfacher geht.
Ich bin mir gerade nicht sicher ob ich deine Frage richtig verstanden habe. Von daher falls ich falsch liege bitte noch mal für blonde erklären was du vor hast.
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Ich würde das gerne per Laufzeit machen und nicht vorher in Gimp Hintergrund der Geschichte ist folgender:
Ich bastel mir gerade ein Programm, dass beliebig viele Texturen in eine Datei speichert.
Im Programm kann man Texturen hinzufügen, löschen, etc.
Außerdem gibt es eine Vorschau via Image Komponente.
Ich "missbrauche" deine Unit quasi als tga, bmp und jpg Loader...
Da ist es natürlich blöd, wenn ich alle Texturen, die ich gerade mal hinzufügen möchte, mit Gimp vorher noch bearbeiten muss.
Deshalb will ich das per Laufzeit machen.
Da es, wie du schon gesagt hast bei Bmp keinen Alpha-Kanal gibt, will ich diesen als einheitliche Farbe darstellen (weiß),
damit bei obigem Bild keine störenden Bildinformationen mehr vorhanden sind.
Wegen der Geschwindigkeit her ist es mir völlig egal, es ist ja nur eine Vorschau in einem Hilfsprogramm
Nach dem Laden wird für jedes Pixel diese Methode aufgerufen. Und die nimmt je nach Quellalphawert dann den Maximalwert des einzelnen Kanals oder aber den bestehenden Wert. Somit funktioniert das automatisch für alle lesbaren Formate. Denke ich.
Wobei du das mit der Funktion eigentlich auch auf einen Hintergrund/farbe blenden könntest.
Trotzdem hast du mir mit deiner Antwort sehr geholfen, da ich gar nicht wusste, dass und wie man bei bei glBitmap eigene Pixelfunktionen hinzufügen kann (-> tolle Implementierung).
Vielen Dank!
Problem gelöst
PS: Was mir noch aufgefallen ist: Warum verwendest du denn Cardinal als Red, Green, Blue und nicht byte?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Warum ich Cardinal verwende ist recht einfach. Nicht alle Formate haben 8 Bit pro Farbkanal. Es gibt zum Beispiel auch das Format RGB10A2 was von DDS problemlos unterstützt wird. Dabei sind dann die Farbwerte für Rot, Grün und Blau jeweils 10 Bit groß. Und mit PNGs kann man auch problemlos 16 Bit pro Kanal ablegen. Und somit ist diese Schnittstelle schon mal bis maximal 32 Bit ausgelegt. Auch wenn es noch kein Format gibt was das richtig unterstützt.
Die Funktionsschnittstelle benutze ich an den verschiedensten Stellen. So zum Beispiel auch beim Konvertieren des Formats, beim Invertieren oder beim Umwandeln in eine NormalMap. Die ist zwar halbwegs schnell aber eben auch sehr generell gehalten wodurch sie nie Rekorde brechen wird.
Aber deine Lösung funktioniert nur solange das Format auch 8 Bit Pro Kanal besitzt. Wenn du andere Format ausschließen kannst ist es überhaupt kein Problem.
PS: Warum ist in deinem Code eigentlich ein round enthalten? Tippe mal auf überbleibsel einer Spielerrei.
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Lossy hat geschrieben:
PS: Warum ist in deinem Code eigentlich ein round enthalten? Tippe mal auf überbleibsel einer Spielerrei. Wink
Das ist tatsächlich nur ein Überbleibsel eines meiner vorangegangener Tests. Es hat nämlich schon ne weile gedauert, bis ich auf die Lösung kam... Hatte vorher mit "/" rumprobiert, daher das round. Danke für den Hinweis! Ich werde es korrigieren.
Lossy hat geschrieben:
Aber deine Lösung funktioniert nur solange das Format auch 8 Bit Pro Kanal besitzt. Wenn du andere Format ausschließen kannst ist es überhaupt kein Problem.
Diese Funktion wende ich nur bei tga's an, alles andere bmp, jpg bleibt davon unberührt
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.