Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#23

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen

  Alt 16. Aug 2016, 16:55
Also wie gesagt, das eigentliche Laden und Umwandeln von Graphiken klappt nun, das sogar sehr gut und schnell.

Jetzt habe ich vorhin groß getönt, dass ich mich um das verkleinern im PowerOf2-Maßstab kümmere... Tja...

Mit dem jetzigen Code
Delphi-Quellcode:
  ms := TMemoryStream.Create;
  ms.Position := 0;
  wic := TWICImage.Create;
  wic.LoadFromFile(_Filename);
  ResizeImage(wic, TexturWidth, TexturHeight);
  wic.ImageFormat := wifPng;
  wic.SaveToStream(ms);
  ms.Position := 0;
  LoadFromStream(ms);
  FreeAndNil(ms);

  GenTexture(True); // geladene Textur an OpenGL übergeben
wird die Graphik tatsächlich auf eine sinnvolle Texturgröße geschrumpft, allerdings haben nun -situationsbezogen- die X- und Y-Achsen unterschiedliche Skalierungen. Textur Width/Height sind ja ein vielfaches von 2, also 2^x, und meist sind die Texturen quadratisch. Somit würde nun, wenn ich das Bild stupide render, alle Bilder die nicht exakt quadratisch sind, in Höhe oder Breite gequetscht oder auseinandergezogen erscheinen (verzerrt).

Eigentlich wollte ich auf die (quadratischen) Texturen die Graphik im richtigen Seitenverhältnis größtmöglich zeichnen, und den -wegen Seitenverhältnis- ungenutzten Bereich dann zukünftig beim rendern einfach ignorieren (ich merke mir Breite und Höhe des "wirklichen" Bildes auf der Textur).

Jetzt habe ich das Problem, dass das Bild (verzerrt) auf der ganzen Textur vollflächig dargestellt wird (ich stauche ja die komplette Graphik aus egal welchem Seitenverhältnis z.B. auf 2048x1024). Andererseits kann man das auch positiv sehen: Eine Seite der Textur wäre ja eh vollständig genutzt worden (Breite oder Höhe), weil das Bild ja nicht auf beiden Achsen kleiner gemacht wird, als die Textur ist; wäre ja auch Quatsch. Auf der anderen Achse (also nun die verbleibende Höhe oder Breite) bleiben nun durch das nicht-beibehalten des Seitenverhältnisses mehr "Bildinformationen" von der ursprünglichen Graphik mit vll. 20'000px über, d.h. auf der kompletten Breite habe ich nun 2048 Pixel vom Originalbild über anstatt vielleicht nur 2000. Wenn man die Graphik später auf dem Bildschirm noch kleiner darstellt ist vielleicht die Skalierung einen Hauch feiner, als ohne die beispielhaften 48px? Es könnte natürlich auch sein, dass es um so schlimmer aussieht? Meinungen?

Wie könnte ich mit WICImage Stretchdraw durchführen, es hat ja keinen Canvas...?

@bytecook:
> Bild via LoadPng it ein TBitmap32 laden.
Ja was passiert denn, wenn es eine .tif oder .jpg-Datei ist. Geht dann LoadPNG trotzdem?

> Bild auf gewünschte Größe resamplen. (Am besten je nach Geschmack/Quali mit einem Lanczos Resampler). Die meisten Lowlevel-Routinen in Gr32 sind SSE2 optimiert, also seeeehr schnell...
Sollte irgendwie gehen.

> Bild auf GlBitmap via Scanline übertragen.
Da wird's schon wieder lustig, weil ich habe keine Ahnung, wie das gehen soll. TglBitmap2d bietet meines Wissens keine ScanLine an, weil es ja kein TBitmap oder so in dem Sinne ist.
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit
  Mit Zitat antworten Zitat