JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=3e9fc82516d9ab3f248a35daf94d1ebfMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Auslesen eines PNGs aus dem Arbeitsspeicher

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
fast hawk
Senior JLI'ler



Anmeldedatum: 15.07.2005
Beiträge: 237
Wohnort: Freiburg
Medaillen: Keine

BeitragVerfasst am: 17.10.2007, 17:16    Titel: Auslesen eines PNGs aus dem Arbeitsspeicher Antworten mit Zitat

Hi
hab en kleines Problem:
Ich hab ein archiv in dem alle meine resourcen drinnen sind.
Dann less ich aus dem archiv jetzt zum beispiel ma mal die "menubackground.PNG".
Wenn ich die jetzt aus dem archiv gelessen hab, hab ich die Datei im Arbeitsspeicher... Nun gut aber wie sag ich jetzt meiner Direct3D Rutinne das sie ihrer Textur nicht von der Festplatte sonder aus dem Arbeitsspeicher nehmen soll. Den die Dateistruktur ist vollständig identisch!! Ich könnt natürlich die Datei dann wieder einzeln über einen Binärstream auf die Festplatte speicher und nach dem auslesen wieder löschen aber das scheint mir eine ziemliche Verschwendung! So ist meine Frage jetzt ob jmd eine Möglichkeit kennt Direct3D zu sagen :"Hey du, du bekommst jetzt eine Adresse im Arbeitsspeicher und keinen Pfad von der Festplatte.." Oder müsst ich dann selber eine eigene Funktion schreiben die die Datei entkomprimiert(JPG->BMP) und als Textur anlegt??


Schon jetzt vielen Dank!

gruß f. hawk
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 17.10.2007, 17:30    Titel: Antworten mit Zitat

Soviel ich weiß gibt es da eine D3DXCreateTextureFromFileInMemory(...) Methode vom IDirect3DDevice9. Der brauchst du dann nur anstatt dem Pfad auf der Festplatte die Adresse im Arbeitsspeicher übergeben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 17.10.2007, 20:52    Titel: Antworten mit Zitat

in meinem Res-Manager nutze ich das:

Code:
// Textur hinzufügen
void Cresmanager::AddTexture(char* lpFileName)
{
    // testen, ob die Textur bereits vorhanden ist
    LPDIRECT3DTEXTURE9 lpTexture = this->GetTexture(lpFileName);

    // wenn sie nicht vorhanden ist, wird sie wie
    // gewohnt erzeugt
    if(!lpTexture)
    {
      int size;
      void* data;
      data = Archiv.LoadFile(lpFileName, &size);

      D3DXIMAGE_INFO ImgInfo;
      D3DXGetImageInfoFromFileInMemory(data, size, &ImgInfo);
   
      LPDIRECT3DTEXTURE9 lpTexture;

      D3DXCreateTextureFromFileInMemoryEx(m_lpD3DDevice,
                                 data,
                                 size,
                                 ImgInfo.Width,
                                 ImgInfo.Height,
                                 1,0,
                                 D3DFMT_UNKNOWN,
                                 D3DPOOL_MANAGED,
                                 D3DX_FILTER_NONE,
                                 D3DX_FILTER_NONE,
                                 0,0,0,
                                 &lpTexture);

        // und in die Map unter ihrem Namen eingefügt
        this->m_MapTextures[lpFileName] = lpTexture;
    }
}


Hier noch Archiv.LoadFile, aus meiner Klasse, die die Dateien aus einem unkomprimierten Zip-Archiv holt. Ist evt. interessant für den Wert von data ^^
Wobei data halt nur der Zeiger auf das Bild ist ^^
... aber der vollständigkeit halber die methode:

Code:
void* Czipreader::LoadFile(char* FileName, int* ObjectSize)
{
   char* ZipFilename = priv_Archiv;
   char* ObjectName = FileName;


    // Datei zum binären Lesen öffnen
    FILE* File = NULL;
   fopen_s(&File, ZipFilename, "rb");
    if(!File) return 0;

    ZipHeader Header;
    char Filename[256];

    // Schleifenbeginn
    while(true)
    {
        // Header einlesen. Bei Ende der Datei: Abbruch!
        fread(&Header, 1, sizeof(ZipHeader), File);
        if(feof(File)) {fclose(File); return 0;}

        // Dateiname einlesen
        ZeroMemory(Filename, 256);
        fread(Filename, 1, Header.FilenameLength, File);

        // Eventuelle Extradaten werden übersprungen.
        fseek(File, Header.ExtraLength, SEEK_CUR);

        // Ist dies das gesuchte Objekt?
        if(!stricmp(Filename, ObjectName))
        {
            // Ja! Signatur, Kompression und Verschlüsselung prüfen.
            if(Header.Signature != 0x04034B50 ||
               Header.CompressionMethod != 0 ||
               Header.GeneralPurpose & 0x0001)
            {
                // Entweder Signatur falsch, oder das Objekt ist
                // komprimiert oder verschlüsselt!
                fclose(File);
            
                return 0;
            }

            // Alles OK - Wir verlassen die Schleife!
            break;
        }

        // Das Objekt ist nicht das Gesuchte!
        // Wir überspringen seine Daten und die eventuell folgenden
        // 12 Bytes.
        fseek(File,
              Header.CompressedSize
              + ((Header.GeneralPurpose & 0x0008) ? 12 : 0),
              SEEK_CUR);
    }

    // Das Objekt wurde gefunden und der Lesezeiger zeigt nun
    // direkt auf seine Daten. Wir reservieren einen Speicherbereich
    // von entsprechender Größe und lesen die Daten hinein.
    char* Data = new char[Header.CompressedSize];
    fread(Data, 1, Header.CompressedSize, File);

    // Datei schließen
    fclose(File);

    // Falls gewünscht: Die Größe der Daten eintragen
    if(ObjectSize) *ObjectSize = Header.CompressedSize;

    // Zeiger auf die Daten liefern
    return Data;
}

_________________
"A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
fast hawk
Senior JLI'ler



Anmeldedatum: 15.07.2005
Beiträge: 237
Wohnort: Freiburg
Medaillen: Keine

BeitragVerfasst am: 18.10.2007, 14:29    Titel: Antworten mit Zitat

hey vielen dank genau das was ich brauche!

@asto komisch meine funktion sieht fast genauso aus^^ Wink
hast du dich auch von dem einen Tut wo beschreiben ist wie man ein unkomprimiertes zip-archiv ausliest?? Smile

nochmal danke an euch beide!

gruß f. hawk
_________________
Jetziges Projekt: The Ring War
Status: 40%
-----------------------------------
Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.
--
Lucius Annaeus Seneca (4)
röm. Philosoph, Dramatiker und Staatsmann
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum