GIF, PNG



  • Hi,
    ich weiß nicht ganz ob das hier her gehört, baer hat die WinAPI auch Funktionen um GIFs,PNGs oder so zu laden ?

    Ich finde auch keine Bibliotheken, die sich mit Visual C++ 2008 kompilieren und nutzen lassen .

    Wäre toll, wenn ihr mir weiterhelfen könntet ! 😃



  • DarkShadow44 schrieb:

    Ich finde auch keine Bibliotheken, die sich mit Visual C++ 2008 kompilieren und nutzen lassen .

    Das wäre ja noch schöner 😮
    Nimm z.B. FreeImage, das kommt mit fertig kompilierter Library für VC++, das gilt sicher auch für viele andere Grafikbibliotheken.
    Vor allem ist FreeImage aber sehr leicht zu benutzen, was mann von der WinAPI jetzt nicht immer behaupten kann. Ließe sich mit GDI+ aber machen.

    http://freeimage.sourceforge.net/



  • Ich finde auch keine Bibliotheken, die sich mit Visual C++ 2008 kompilieren und nutzen lassen .

    Das wäre ja noch schöner 😮

    Warum ? Es muss doch Bibliotheken geben, die mit C++ laufen 🙄

    Und wie lade ich bei FreeImage z.B. eine animierte, transparente GIF ?



  • DarkShadow44 schrieb:

    Warum ? Es muss doch Bibliotheken geben, die mit C++ laufen 🙄

    Selbstverständlich, deswegen ja auch mein Kommentar...

    DarkShadow44 schrieb:

    Und wie lade ich bei FreeImage z.B. eine animierte, transparente GIF ?

    Es gibt zu FreeImage eine Dokumentation, da wird das alles gut beschrieben. Die einzelnen Frames eines animierte GIFs kannst du z.B. mit FreeImage_OpenMultiBitmap/FreeImage_GetPageCount/FreeImage_LockPage laden.



  • Warum ? Es muss doch Bibliotheken geben, die mit C++ laufen 🙄

    Selbstverständlich, deswegen ja auch mein Kommentar...

    Sorry, das habe ich wohl falsch verstanden 😃

    Könntest du mir dafür ein kleines Beispiel geben ?

    Ich habe das hier gefunden:
    http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=233307&page=1

    Weil in GIFs ist ja gespeichert, nach wie vielen Sekunden das nächste Bild kommt.
    Muss ich dann jedes mal eine neue Textur erstellen ?



  • C-Variante:

    FIMULTIBITMAP* gif=FreeImage_OpenMultiBitmap(FIF_GIF,"dein.gif",false,true,true,0);
    const int pageCount=FreeImage_GetPageCount(gif);
    for (int i=0;i<pageCount;i++)
    {
      FIBITMAP* page=FreeImage_LockPage(gif,i);
      FIBITMAP* rgbPage=FreeImage_ConvertTo24Bits(page); //damit zerstört man sich allerdings jegliche Transparenzinformationen
      FreeImage_UnlockPage(gif,page,false);
    
      //mach was mit rgbPage
      //...
    
      FreeImage_Unload(rgbPage);
    }
    

    Die Framedauer bekommst du sicher auch irgendwie, wahrscheinlich über die Metadatenfunktionen. Weiß ich aber nicht auswendig.

    Mit FreeImage_GetWidth/FreeImage_GetHeight bekommst du die Größe und mit FreeImage_GetPixelColor kannst du einzelne Pixel auslesen. Ist allerdings schneller wenn man sich mit FreeImage_GetBits den internen Buffer holt und dann damit arbeitet.



  • FIBITMAP* rgbPage=FreeImage_ConvertTo32Bits(page);
    

    Gibt das dann Transparenz ?



  • Müsstest du ausprobieren, FreeImage sträubt sich gelegentlich gegen ungewöhnliche Konvertierungen.
    Aber ich glaube, GIF-Dateien können sowieso keinen Alphachannel besitzen, stattdessen ist einfach eine Farbe als transparent markiert.
    Und die bekommst du mit FreeImage_GetTransparentIndex und FreeImage_GetPalette.

    Edit: aber nur vor der Konvertierung nach 24 Bit, danach ist die Palette weg.



  • Und wie setze ich die Transparenzfarbe dann in OpenGL um ?

    Außerdem habe ich das problem, dass "mein" Bild bei den Animationen eine andere Breite/Höhe erhält...
    Der nicht ausgefüllte Rest soll aber transparent/schwarz (möglichst umschaltbar) dargestellt sein...

    Wüsstest du da eine Lösung ?

    EDIT:

    Frame Top und Left habe ich... Muss ich dann leere texturen erstellen und alles reinkopieren ?

    Die Zeit für die einzelnen Frames habe ich übrigens inzwischen 😉



  • DarkShadow44 schrieb:

    Frame Top und Left habe ich... Muss ich dann leere texturen erstellen und alles reinkopieren ?

    Wird am sinnvollsten sein. Die übrigbleibenden Ränder in der neuen Textur kannst du dann "per Hand" einfärben.
    Ich vermute mal einfach, dass Texturen einen Alphachannel haben, den du dann eben an den entsprechenden Stellen auf 255 bzw. 0 setzt.
    Da kann man dir sicher im Spiele-/Grafikprogrammierung-Unterforum weiterhelfen.



  • Müsste es dann nicht reichen, die Farbe, die als Transparentfarbe angegeben ist statt schwarz zu kopieren ? Oder muss ich da den Alpha Channel beachten ?

    Nur Schwarz müsste dann als Transparenzfarbe ausgeschlossen werden 😃
    Und Frame Top und Left dürfen sich nicht nur auf den ersten Frame beziehen, aber das teste ich morgen 😉



  • Hi, ich nutze jetzt diesen Code zur Sortierung:

    int j;
    int zaehler=0;
    for(j= 0; j<width*height; j++){
    
    		int jjw=j;
    
    		while(jjw>=width) jjw-=width;
    
    		float jw=(float)j/width;
    
    		//topXX = Frame Top       leftXX = Frame Left
    		if (jw< topXX || jw > topXX + h || jjw< leftXX || jjw>=leftXX+w)
    		{	
    			textura[j*4+0]= 0; // "Leere" Stellen
    			textura[j*4+1]= 0;
    			textura[j*4+2]= 0;
    			textura[j*4+3]= 0;
    		}
    		else
    		{
    			textura[j*4+0]= pixeles[zaehler*4+2]; // Bild einfügen
    			textura[j*4+1]= pixeles[zaehler*4+1];
    			textura[j*4+2]= pixeles[zaehler*4+0];
    			textura[j*4+3]= pixeles[zaehler*4+3];
    			zaehler++;     // Zähler gibt den jetzigen Pixel des einzufügenen Bildes an
    		}
    
    	}
    

    Seht ihr, was daran falsch ist ? Das Bild ruckelt immer so nach oben und unten...

    Wäre für Hilfe sehr dankbar 🙂


Anmelden zum Antworten