DDS Format ?



  • Hallo !
    Kenn mich leider in dieser Art Programmierung überhaupt nicht aus ! Deshalb die Frage:
    Gibt es ein packages oder ne *.h Datei, also schon etwas fertiges, das diverse DDS Formate im eigenem Programm anzeigen können ? oder kann mir da irgend wer andersweitig weiterhelfen. Ich möchte ähnlich wie in einen viewer DDS-Bilder anzeigen lassen.
    Danke !



  • die dk sdk doku enthält eine vollständige beschreibung des DDS formates...



  • Hallo
    Danke erstmal, da ich dies bestimmt gebrauche kann.
    Aber wie gesagt, habe ich null Ahnung, wie man mit Bildformaten umgeht. Was ich möchte ist ein Bild im DDS Format der Componente Image der VCL zuweisen, also das Bild anzeigen lassen. Wie habe ich vorzugehen. Wie definiert man ein Bildformat ? Welche Schritte sind erforderlich ? Gibt es ein Sample, das man dann auf seine eigenen Bedürfnisse abändern kann ? Leiden habe ich immer nur 'aufwendige' Sachen gefunden, die für VC geschrieben wurden, ich benutze BCB.



  • Aber wie gesagt, habe ich null Ahnung, wie man mit Bildformaten umgeht.

    man geht damit um wie mit jeder anderen Datei 😉

    versuch erst mal BMP Dateien zu laden - dann kannst dich an das dds Format machen!

    Tutorial über BMP Format:
    http://turing.fh-landshut.de/~jamann/Das BMP Format.html

    Beispiel das ne BMP Datei lädt:
    http://turing.fh-landshut.de/~jamann/Tunnel Effect.zip





  • hast du mal ne Beispiel dds Datei für mich, die ich downloaden kann?



  • Hallo
    Also als erstes möchte ich sagen, ich finde es wirklich super von Dir mir so zu helfen. Hätte eher mit "blöden" Kommentaren gerechnet. Beispiele gibt es da ja genug. Und jeder fängt mal an. Also nochmals Danke, findet man nicht so oft.

    hier eine Beispiel *.dds Datei.

    http://www.oldman-1.homepage.t-online.de/daten/test.dds



  • du solltest dir mal nen Hexeditor besorgen und damit die dds Datei untersuchen:

    http://www.handshake.de/user/chmaas/delphi/download/xvi32.zip

    Laut DX SDK kann man sehen das die Magic Value 4 Bytes groß ist
    im Hexeditor kannst du sehen, das die ersten 3 Zeichen "DDS" sind und dann ein Leerschritt folgt

    Die Magic Value ist dazu damit dein Programm feststellen kann, ob wirklich eine DDS Datei vorliegt

    #include <stdio.h>
    #include <windows.h>
    
    bool CheckMagicValue(const unsigned char * MagicValue)
    {
    	if(MagicValue[0] != 'D' ||
    	   MagicValue[1] != 'D' ||
    	   MagicValue[2] != 'S' ||
    	   MagicValue[3] != ' ')
    	{
    		return false;
    	}
    	else
    	{
    		return true;
    	}
    }
    
    bool CheckSurfaceFormatHeaderSize(unsigned int dwSize)
    {
    	if(dwSize != 124)
    	{
    		return false;
    	}
    	else
    	{
    		return true;
    	}
    }
    
    bool CheckSurfaceFormatHeaderFlags(unsigned int dwFlags)
    {
    	#define DDSD_CAPS			0x00000001
    	#define DDSD_PIXELFORMAT	0x00001000
    	#define DDSD_HEIGHT			0x00000002
    	#define DDSD_WIDTH			0x00000004
    
    	if(dwFlags & DDSD_CAPS &&
    	   dwFlags & DDSD_PIXELFORMAT &&
    	   dwFlags & DDSD_HEIGHT &&
    	   dwFlags & DDSD_WIDTH)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}  
    }
    
    int main()
    {
    	// A robust reader should verify key values 
    
    	FILE * dds = fopen("test.dds", "rb");
    
    	// Magic Value auslesen!
    	unsigned char MagicValue[4];
    	fread(&MagicValue, 4, 1, dds);
    
    	printf("MagicValue: ");
    	for(int i = 0; i < 4; i++)
    		printf("%c", MagicValue[i]);
    
    	printf("\n");
    
    	if(!CheckMagicValue(MagicValue))
    	{
    		printf("Fehler: Keine gueltige DDS Datei - MagicValue falsch");
    		fclose(dds);
    		return -1;
    	}
    
    	// Surface Format Header auslesen
    	// DDSURFACEDESC2
    
    	//DWORD dwSize Size of structure. This member must be set to 124.
    
    	unsigned int dwSize = 0;
    	fread(&dwSize, 4, 1, dds);
    	printf("dwSize: %d\n", dwSize);
    
    	if(!CheckSurfaceFormatHeaderSize(dwSize))
    	{
    		printf("Fehler: SurfaceFormatHeaderSize != 124");
    		fclose(dds);
    		return -1;
    	}
    
    	//DWORD dwFlags Flags to indicate valid fields. Always include DDSD_CAPS, DDSD_PIXELFORMAT, DDSD_WIDTH, DDSD_HEIGHT. 
    
    	unsigned int dwFlags = 0;
    	fread(&dwFlags, 4, 1, dds);
    	printf("dwFlags: %d\n", dwFlags);
    
    	if(!CheckSurfaceFormatHeaderFlags(dwFlags))
    	{
    		printf("Fehler: Ein oder mehrere folgender Flags werden nicht unterstuetzt: DDSD_CAPS, DDSD_PIXELFORMAT, DDSD_WIDTH, DDSD_HEIGHT");
    		fclose(dds);
    		return -1;
    	}
    
    	//DWORD dwHeight Height of the main image in pixels 
    	//DWORD dwWidth Width of the main image in pixels 
    	//DWORD dwPitchOrLinearSize For uncompressed formats, this is the number of bytes per scan line (DWORD> aligned) for the main image. dwFlags should include DDSD_PITCH in this case. For compressed formats, this is the total number of bytes for the main image. dwFlags should be include DDSD_LINEARSIZE in this case. 
    	//DWORD dwDepth For volume textures, this is the depth of the volume. dwFlags should include DDSD_DEPTH in this case. 
    	//DWORD dwMipMapCount For items with mipmap levels, this is the total number of levels in the mipmap chain of the main image. dwFlags should include DDSD_MIPMAPCOUNT in this case. 
    	//DWORD dwReserved1[11]  
    	//DDPIXELFORMAT ddpfPixelFormat 32-byte value that specifies the pixel format structure. 
    	//DDCAPS2 ddsCaps 16-byte value that specifies the capabilities structure. 
    	//DWORD dwReserved2 
    
    	fclose(dds);
    }
    


  • ich habe mal den Anfang des Loaders geschrieben - mit dem Laden der Daten an sich solltest du keine Probleme mehr haben



  • wow , super! Es geschehen noch Wunder 🙂
    werde gleich mal probieren.
    Hatte schon mit ne hex-Editor mal reingeschaut, aber wie gesagt, wenn man noch nichts in der Richtung gemacht hat, sagt das einen weniger.

    Danke für Deine Mühe.



  • Dateien zu laden ist eigentlich stumpfsinnige Programmierarbeit 😉

    Im Prinzip macht man immer das gleiche:

    Wav Format:
    http://turing.fh-landshut.de/~jamann/Audioprogrammierung unter Windows mit C++ fuer Computerspiele.pdf

    Ms3D Format:
    http://turing.fh-landshut.de/~jamann/Das Ms3D Format.html



  • So sind EXE Dateien gespeichert:
    http://www.xbdev.net/fileformats/pe/pe.php

    es ist immer das gleiche 😉



  • Muß schon dagen, bin schwer beeindruckt !!! 😮
    alles super Sachen. Herzlichen Dank !! 👍



  • neben diesen Binärdaten sind noch XML und fette Datenbanken weit verbreitet - aber das würde den Rahmen dieses Forumbeitrags sprengen 🕶

    XML ist ne Super sache, wenn du kleine Datenmengen speichern willst, oder Objekte serialisieren willst



  • Vertexwahn schrieb:

    ich habe mal den Anfang des Loaders geschrieben - mit dem Laden der Daten an sich solltest du keine Probleme mehr haben

    sorry, habe ich leider doch 😕
    Hatte mir das so gedacht

    LoadDDS (const char* DDSFilename)
    {
     FILE * dds = fopen(DDSFilename,"rb");
    

    und dann mit

    LoadDDS ("c:\\test.dds");
    

    aufrufen. oder ?

    aber wie komme ich dann an das Bild, will heißen du schreibst 'printf' ? sorry
    das hierzu in der Hilfe "Schreibt formatierte Ausgaben in die Standardausgabe stdout."
    printf ist konsole oder ?
    Wo und wie soll ich das Bild dann darstellen lassen ?



  • Wo und wie soll ich das Bild dann darstellen lassen ?

    in einem Fenster mit der GDI:
    http://turing.fh-landshut.de/~jamann/Tunnel Effect.zip



  • Bin Dir ja wirklich dankbar, daß Du mir helfen willst, aber leider bin ich wahrscheinlich ein "hoffnungsloser Fall". Wie gesagt, habe ich mit Grafik noch nichts gemacht außer ein Bild eingelesen, aber was in der VCL integriert ist. Imgage1->Picture->LoadFromFile... Da ich kein wirklich für mich nachvollziehbares Beispiel besitze, mit dem ich experimentieren kann, um gewisse Ding, Zusammenhänge zu verstehen, fällt es mir schwer die für Dich 'normalsten Dinge' nachzuvollziehen. Ich suche seit Tagen im Internet und in Bücher, aber meist sind es riesen Projekte (z.B. NVIDIA Utility) und dann in VC++, mit jeder Menge unüberschaubarer #include ... .h Dateien, und somit kann ich als Anfänger keinen Überblick bekommen. Hatte Dir etwas per e-mail geschickt. Kann man damit was anfangen ?

    p.s.
    Beispiel 'Tunnel' ist in VC++ und keinerlei printf Anweisungen. Sorry, daß ich mich so 'blöd' anstelle. 🙄

    mfg

    OldMan



  • du solltest erst mal herausfinden wie die in die PictureBox überhaupt etwas zeichnen kannst - bestimmt gibts da fertige Funktionen zum Zeichnen von einzelnen Pixel, Linien, Kreisen, Rechtecken und Polygonen - spiel damit mal rum

    am schönsten wäre es natürlich wenn du herausfinden würdest, dass BMP und JPG von einer bestimmten Basisklasse abgeleitet sind die z. B. Image (Interfaceklasse) heißt - diese Image Klasse musst du dann konkret für das DDS Format implementieren

    wie das genau geht können dir die Leute in einem Borland VCL Forum sagen - im schlechtesten fall musst du wirklich Pixelweiße jedes Bildelement in die Picture Box zeichnen mit einer Methode wie SetPixel (wie die genau heißt kann ich dir nicht sagen - bin keine wandelnde Onlinedokumentation ;))

    beim DDS Format sehe ich eine Schwierigkeit: es gibt verschiedene Kompressionen. Bin mir da nicht ganz sicher aber ich glaube da was gelesen zu haben. Solange das nur RLE ist, ist das kein Problem aber wenn den Fourier Entwicklung und ähnliche Sachen kommen fängt der Spaß richtig an



  • bestimmt gibts da fertige Funktionen zum Zeichnen von einzelnen Pixel, Linien, Kreisen, Rechtecken und Polygonen

    soweit ich das mitbekommen habe ist das

    Canvas->Brush...
    Canvas->FillRec....
    Canvas->Draw...
    Canvas->Pixel....
    usw.
    

    Weist Du wo ich die impletierten Grafikformate der VCL finde ? um da evtl. zu sehen wie es definiert ist.



  • Weist Du wo ich die impletierten Grafikformate der VCL finde ? um da evtl. zu sehen wie es definiert ist.

    die sind bestimmt nicht offen. Aber in der Doku könnte stehen von welchem Interface diese Klassen abgeleitet sind.

    Wenns nicht auf Geschwindigkeit ankommt würde ich Canvas->Pixel.... nutzen - du weißt ja wie man die Pixeldaten in den Speicher lädt... jetzt musst du in ner for Schleife nur über deinen Speicherbuffer drüberlaufen und jedes Pixel "rausmalen"

    for(int x = 0; x < breite_desbildes; x++)
      for(int y = 0; y < höhe_desbildes; y++)
       Canvas->DrawPixel(x, y, Speicherbuffer[x+y*breite]);
    

Anmelden zum Antworten