AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Anzeigen von DDS Dateien

Offene Frage von "himitsu"
Ein Thema von creehawk · begonnen am 28. Nov 2017 · letzter Beitrag vom 13. Sep 2020
Antwort Antwort
Seite 1 von 2  1 2      
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.118 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Anzeigen von DDS Dateien

  Alt 29. Nov 2017, 07:57
Lag hier rum, ist von 2012 aber sollte immer noch laufen. Methoden sind LoadDXT1, LoadDXT3 und LoadDXT5, such dir eins aus oder schreib eine Methode, das das erkennt. Index, Heights und Widths sind wegen des Programms, das sie verwendet hat, da, weil es die als vertikale ImageStrips benutzt hat und so ein wahlfreier Zugriff möglich ist. Daten werden in einen MemoryStream kopiert, weil das byteweise Lesen von FileStreams sehr langsam ist.
Angehängte Dateien
Dateityp: zip RedeemerGfx.zip (4,7 KB, 20x aufgerufen)
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Anzeigen von DDS Dateien

  Alt 29. Nov 2017, 08:51
Lag hier rum, ist von 2012 aber sollte immer noch laufen. Methoden sind LoadDXT1, LoadDXT3 und LoadDXT5, such dir eins aus oder schreib eine Methode, das das erkennt. Index, Heights und Widths sind wegen des Programms, das sie verwendet hat, da, weil es die als vertikale ImageStrips benutzt hat und so ein wahlfreier Zugriff möglich ist. Daten werden in einen MemoryStream kopiert, weil das byteweise Lesen von FileStreams sehr langsam ist.
Funktioniert gut für die drei Formatvarianten (nachdem ich den Filestream-Parameter angepasst habe)!
Mit der Vorlage sollte der TE ggf. auch die anderen Formate implementieren können, wenn er sie denn braucht.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#3

AW: Anzeigen von DDS Dateien

  Alt 29. Nov 2017, 11:41
@creehawk
Dann würde ich sagen, glBitmap macht Dein Format nicht ....
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Anzeigen von DDS Dateien

  Alt 29. Nov 2017, 13:20
Mir ist noch was eingefallen. Du könntest es auch per DirectX an sich laden.
Mit folgenden Codeschnipsel hast du zumindest die geladene DDS-Datei als IDirect3DTexture9 und IDirect3DSurface9 vorliegen.

Es würde noch die Möglichkeit geben das in eine IDirectDrawSurface7 umzukopieren und die dann wiederum zu verwenden, um ein Winapi.GDIOBJ.TGPBitmap zu erzeugen. Vom TGPBitmap aus kann man ja weitermachen...
Sag Bescheid, wenn du das dann brauchst.

Delphi-Quellcode:
uses
  Winapi.GDIPOBJ,
  Winapi.Windows,
  Winapi.Direct3D9,
  // Winapi.DirectDraw,
  Winapi.D3DX9;

procedure LoadPerDirectX(const Filename: string);
var
  HR: HRESULT;
  Direct3D: IDirect3D9Ex;
  Device: IDirect3DDevice9;
  Texture: IDirect3DTexture9;
  Params: TD3DPresentParameters;
  DisplayMode: TD3DDisplayMode;
  D3DSurface: IDirect3DSurface9;
  // DDSurface: IDirectDrawSurface7;
begin
  HR := Direct3DCreate9Ex(D3D_SDK_VERSION, Direct3D);
  if Failed(HR) then
    Exit;

  HR := Direct3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, DisplayMode);
  if Failed(HR) then
    Exit;

  FillChar(Params, SizeOf(Params), 0);
  Params.SwapEffect := D3DSWAPEFFECT_DISCARD;
  Params.BackBufferCount := 1;
  Params.BackBufferWidth := DisplayMode.Width;
  Params.BackBufferHeight := DisplayMode.Height;
  Params.BackBufferFormat := DisplayMode.Format;

  HR := Direct3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 0, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @Params, Device);
  if Failed(HR) then
    Exit;

  HR := Winapi.D3DX9.D3DXCreateTextureFromFile(Device, PWideChar(Filename), Texture);
  if Failed(HR) then
    Exit;

  HR := Texture.GetSurfaceLevel(0, D3DSurface);
  if Failed(HR) then
    Exit;
end;

Geändert von TiGü (29. Nov 2017 um 14:01 Uhr)
  Mit Zitat antworten Zitat
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
243 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Anzeigen von DDS Dateien

  Alt 29. Nov 2017, 14:37
@redeemer

Herunterladen : 5 Sekunden - Einbauen : 120 Sekunden - Ausprobieren : 360 Sekunden - Erfolg: 100% !

Perfekt.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Var
PNGTyp:TPngImage;
begin
PNGTyp:= TPNGIMAGE.Create;
PNGTyp := LoadDXT1('aaaaa');
Image1.Picture.Assign(PngTyp);
end;
Das ist alles. LoadDXT1 ist alles was ich brauche, die DDS Dateien stammen aus den PC Spielen CaesarIV, Anno1404 und Age of Empires 3.

@an alle die geantwortet haben
Ich bin nicht der Experte für PC Grafik. Vieles davon muss und musste ich mir empirisch zusammenbasteln, "basteln" wörtlich genommen. Und die o.g. LoadDXT1 ist mir in ihrer Ausführung auch ziemlich schleierhaft.
Wir hier bauen für einige ältere Spiele - siehe oben - Karten, Missionen und Hilfstools. Das spielt sich eher in dem Bereich Datenbank oder auch schlichter Textbearbeitung ab.

Ich bedanke mich bei allen für die Antworten und Hilfestellungen!

creehawk
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Anzeigen von DDS Dateien

  Alt 29. Nov 2017, 14:41
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Var
  PNGTyp:TPngImage;
begin
  PNGTyp := LoadDXT1('aaaaa');
  Image1.Picture.Assign(PngTyp);
  PNGTyp.Free;
end;
Sonst hast du Speicherlecks!

Geändert von TiGü (29. Nov 2017 um 15:23 Uhr)
  Mit Zitat antworten Zitat
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
243 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Anzeigen von DDS Dateien

  Alt 29. Nov 2017, 17:06
Ups, alles klar, danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.386 Beiträge
 
Delphi 12 Athens
 
#8

AW: Anzeigen von DDS Dateien

  Alt 13. Sep 2020, 16:03
Herunterladen : 5 Sekunden - Einbauen : 120 Sekunden - Ausprobieren : 360 Sekunden - Erfolg: 100% !

Perfekt.
Speicherleck 200%.

Einmal die Instanz vom Create, dann nochmal aus LoadDXT1, und am Ende wird Keine davon wieder freigegeben.

Zitat:
Sonst hast du Speicherlecks!
Und ja, nach einem Fehler kann Aufräumen auch nie schaden.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Sep 2020 um 16:18 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.055 Beiträge
 
Delphi 12 Athens
 
#9

AW: Anzeigen von DDS Dateien

  Alt 13. Sep 2020, 19:24
Wieso? Der Code im Post direkt vor seinem = "preceding" gibt doch das png image frei! Oder was hab' ich übersehen?
  Mit Zitat antworten Zitat
haluter

Registriert seit: 13. Sep 2020
1 Beiträge
 
#10

AW: Anzeigen von DDS Dateien

  Alt 13. Sep 2020, 13:44
Hi, apologies for using English but I am desperate for some help.

I need to load a DDS file and display it in a TImage32 (or TImage/TBitmap) component, but I have been unable to do so.

Could I please ask you for an example on how to do this (if possible?)

Thank you!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz