Textur laden



  • wahrscheinlich eine ziehmlich blöde Frage, aber ich komm einfach nicht weiter 😞
    ich möchte eine textur laden, aber egal wie ich den relativen pfad angebe (../, /, :/), mein programm wirft mir immer den qDebug, dass die datei nicht geladen wurde.
    ich dachte, ich wäre schlau und würde mir den pfad absolut ausgeben lassen via QApplication::applicationFilePath(), was aber natürlich nichts bringt, da er dann den pfad der app angibt.

    meine frage nun, woran kann der Fehler liegen bzw. wie gehe ich vor um ihn los zu werden... also wie debuge ich das problem (ich komm mir echt nicht so smart vor)?

    QImage b,t;
    
    if ( !b.load(":/images/side.bmp") ) {
    	qDebug ("Texture not loaded!");
    	QString s = QApplication::applicationFilePath();
    	qDebug (s.toLatin1 ());
    }
    else
    	qDebug (":)");
    
    t = QGLWidget::convertToGLFormat( b );
    glGenTextures( 1, &texture[0] );
    glBindTexture( GL_TEXTURE_2D, texture[0] );
    ...
    

    danke im voraus

    ps: JA, die datei gibt es und sie liegt auch im verzeichnis!



  • Hallo Brusik,

    versuchs mal mit

    b.load("images/side.bmp")
    

    Viele Grüße,
    MaBa



  • ... danke MaBa, dass habe ich aber leider schon erfolglos versucht. Ich würde mich nämlich auch schlecht fühlen mit ganz trivialen Problemen hier das Forum zu spamen.

    Die Sache ist, das Laden von Dateien ist normalerweise kein Problem (bis jetzt ;o), aber hier stehe ich an und ich weiss nicht wie ich herausfinden kann, was das Problem ist, weil ich keine Fehler vom Compiler bekomme.

    Ich habe natürlich schon andere Formate probiert und sichergestellt, dass die Datei auch wirklich dem entspricht was drauf steht, was ja bei Bilddateien gerne mal nicht so ist.

    Ich weiss also schlichtweg nicht mehr, wo ich ansetzen kann/soll 😞



  • Hallo Brusik,

    ps: JA, die datei gibt es und sie liegt auch im verzeichnis!

    Dann bräuchten wir noch die folgende Info: In welchem Verzeichnis? Im Debug-Verzeichnis?

    Viele Grüße,
    MaBa



  • In dem Verzeichnis in dem auch die main.cpp liegt, also halt der Ordner.

    Ordner cg:
    ...
    main.cpp
    images
    ...

    Hab aus Verzweiflung dann im Ordner
    cg-build-desktop auch noch einmal "images" inkl. Inhalt angelegt. Sofern das zur Laufzeit ausgelesen wird.

    Was mich verrückt macht, ich lese ja oft genug aus txt Files Daten aus, und das Qt Referenzbeispiel für Textures funktioniert ja auch... was kann man da bitte falsch machen? Ist ja nicht so dass ich mit doppelten Pointern auf virtuelle firend functions schieße... ich komm mir vor als säße ich zum ersten mal vor einem Compiler.



  • Hallo Brusik,

    wenn der "images"-Ordner in dem Verzeichnis liegt, in dem sich auch deine ausführbare Datei liegt (z.B. bei Visual Studio im Debug-Modus: "Debug"), sollte es funktionieren. Denn dann stimmt der relative Pfad (aus Sicht der ausführbaren Datei) zu den Bildern.

    Viele Grüße,
    MaBa



  • Die .pro Datei muss um folgende Zeile erweitert werden oder alternativ mit Ressourcendateien gearbeitet werden.

    CONFIG -= app_bundle
    


  • mit ":/bla/blubb" sucht der eine ressource datei ... hast du die?



  • padreigh schrieb:

    mit ":/bla/blubb" sucht der eine ressource datei ... hast du die?

    ... genau, also was da intern dann genau passiert, weiss ich auch nicht, aber er generiert eine art XML datei und über die funktioniert das ganze dann so wie erwartet.



  • Ist nicht so schwer. In der generierten qrc Datei steht wo die Datei(en) liegen, eventuell auch ein Alias um einfacher drauf zugreifen zu können:

    <RCC>
        <qresource prefix="/icons">
            <file alias="monkey">icons/Monkey-icon2.png</file>
            <file alias="frog">icons/Turtle-icon.png</file>
        </qresource>
    </RCC>
    

    Der Pfad in dieser Datei ist relativ zu der Datei selbst. Im Programm kannst es per QImage nun zB so laden QImage myImage(":/icons/monkey"); . Ermöglicht wird dies dadurch das qmake die qrc Datei parsed und ein .cpp file generiert das quasi die Bilder "enthält":

    static const unsigned char qt_resource_data[] = {
      // /XXX/icons/Monkey-icon2.png
      0x0,0x0,0xdb,0x54,
      0x89,
      0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,
      0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x8,0x6,0x0,0x0,0x0,0x5c,0x72,0xa8,0x66,
      [snipp noch viel mehr hexaZahlen]
      // /XXX/icons/Turtle-icon.png
      0x0,0x0,0xbe,0xd3,
      0x89,
      0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,
      0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x8,0x6,0x0,0x0,0x0,0x5c,0x72,0xa8,0x66,
      0x0,0x0,0xbe,0x9a,0x49,0x44,0x41,0x54,0x78,0xda,0xec,0x7d,0x7,0xa0,0x1d,0x55,
      [snipp noch viel mehr hexaZahlen]
    };
    
    [snipp noch ein paar andere deklarationen]
    

    In der Datei steht quasi das Bild als HexWerte + paar Verwaltungssachen (Bildgrößen, Aliasnamen, usw.) drin. Beim compilieren/linken wird das alles dazukompiliert und gelinkt und steht dir dann überall zur Verfügung.

    Siehe: http://doc.qt.nokia.com/latest/resources.html

    Ansonsten lies mal: http://doc.qt.nokia.com/latest/qimage.html#load und schau mal bei http://doc.qt.nokia.com/latest/qimagereader.html#supportedImageFormats rein .. vielleicht fehlt dir das entsprechende Image Plugin? Ansonsten benutz mal die QImageReader Klasse zum laden eines Bildes und schau deren QString QImageReader::errorString () const an .. der ist informativer als das bool das QImage()::load(..) zurückliefert



  • Wunderbar, danke für die Hilfe! :p


Anmelden zum Antworten