Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#1

Bilder [mit/ohne Transparenz] in universelles Format bringen

  Alt 16. Aug 2016, 12:32
Hallo,
das ist ein indirekter Cross-Post zu https://delphigl.com/forum/viewtopic.php?f=10&t=11526 , bei dem ich das Problem nun von mehr von der "Delphi"-Seite als von der OpenGL-Seite angehen will.

Zusammenfassung:
Die Benutzer verwenden viele verschiedene Dateiformate (teilweise mit Transparenz), und die Graphiken sind viel manchmal zu groß für die Graphikkarte und sprengen den Arbeitsspeicher. Die Graphiken werden letztendlich als TglBitmap2D im Arbeitsspeicher gehalten und mit OpenGL dargestellt, müssen jedoch vorher verkleinert werden.

Problem:
Neben den vielfältigen Dateiformaten (JPG, BMP, PNG, TIF, ...) gibt es innerhalb dieser Dateiformate noch Unterschiedliche Einstellungen wie "PixelFormat" etc. Für die Zuweisung an TglBitmap2D fehlt mir das Hintergrundwissen 1) welche Dateiformate es alles gibt 2) welche Pixelformate es für die jeweiligen Dateiformate gibt 3) welche Besonderheiten zu beachten sind etc.

Genaugenommen sollte das eigentlich auch nicht mein Problem sein. Über TImage/TPicture kann ich ja alle verschiedenen Bild-Dateiformate korrekt laden und in einer VCL-Form mit TImage korrekt darstellen lassen. D.h. irgendwo sind ja die Pixeldaten für diese Graphik schon vorhanden.

Leider kann ich die Pixel des Bildes, das irgendwo in dem TPicture-gebilde abgespeichert ist, nicht 1:1 übernehmen (z.B. via ScanLine), da je nach Dateiformat und -codierung die Byte-Werte für Rot-Grün-Blau und Alpha (% Transparent 0-255, sofern vorhanden) in den unterschiedlichsten Reihenfolgen (RGB, BGR, RGBA ARGB, ABGR, ...) und Bitbreiten vorkommen, und ich somit auch wieder eine "Zuordnungstabelle" bräuchte, um je nach Situation die Bytes anders zu drehen...

Anmerkungen: Dass Texturen PowerOf2 sein müssen ist mir klar; mein Programm regelt das generell; es sollte nicht Thema dieses Threads sein.

Was ich brauche:
Ich brauche eine TImage/TPicture Kopie des originalen TImage/TPicture (nur halt verkleinert). Diese muss dann als Format noch lesbar sein, damit TglBitmap2D damit noch was anfangen kann.

Das habe ich bereits probiert:
-Google/DP/DelphiGL Suche: War leider nicht so erfolgreich: Meistens werden bei Programmen ja die Graphiken mitgeliefert (also die Texturen) und liegen in einem einheitlichen Format vor den Ansprüchen von OpenGL angemessen ist.

-TBitmap erzeugen und mit Draw/StretchDraw/StretchBlt zeichnen: Generell gute Idee. Wichtig zu Wissen, dass TBitmap <> dem Dateiformat .bmp ist, und somit auch generell in der Lage ist, die TransparenzInformationen zu "halten". Das Problem ist, dass TglBitmap2D mit 32-Bit Bitmaps nichts anfangen kann und die Textur verwirft (Fehler beim Laden vom Stream; falscher Header für Bitmap Format). D.h. ich muss alle Graphiken auf 24Bit reduzieren, und das würde also bedeuten, dass ich alle TransparenzInformationen verliere? Keine Option! Ich habe es mit AssignFromBitmap und LoadFromStream probiert.

-Selber Weg wie oben, nur das Bild auf ein TPNGImage zeichnen: Scheitert schon daran, dass ich kein "leeres" TPNGImage.CreateBlank erzeugen kann. Sowohl mit COLOR_RGB wie COLOR_RGBAlpha und Bittiefe 32, notfalls 24, jedesmal gibt es einen Fehler mit "Ungültige Werte". Wie kann ich ein leeres PNG-Bild erzeugen, dass die maximale Farbtiefe und Alpha-Informationen hat? Weil dann könnte ich drauf zeichnen und das Bild dann mit TglBitmap2D.LoadFromStream laden (TglBitmap2D unterstützt PNG).

-Ich habe auch diverse andere Sachen probiert, wie die Bilder umzuwandeln und als temporäre Datei auf Festplatte zu speichern und neu zu laden. Aber das bringt auch keine Besserung, wenn das Dateiformat (.bmp) wieder Beschränkungen mit der Farbtiefe hat oder spätestens beim Laden (pf32Bit) wieder inkompatibel zu TglBitmap2D wird. Auch PNG kann ich nicht zwischenspeichern, weil ich ja kein neues PNG als Objekt erzeugen kann...

Wie gehe ich da weiter vor?

Danke im Vorraus!
  Mit Zitat antworten Zitat