SDL_Image / PNG Datei wird nicht angezeigt



  • Mir ist schon klar dass das "p" für pointer steht, find es aber trotzdem unangenehm zu lesen (ich weiß das Leute die das verwenden das irgendwie einfach überlesen können, für mich macht es das lesen halt irgendwie mühsam).

    Ich glaube nicht, das du bei SDL_SetClipRect() ein SDL_FALSE zurückbekommst, weil das eher dafür ist, wenn das ClipRect gar nicht gesetzt werden konnte - aber das clip rect wird ja gesetzt, nur auf einen nutzlosen Wert. Zumindest war das bei meinem Fehler mal bei mir so, habe aber SDL 2.0 nicht direkt verwendet sondern habe nur Erfahrung mit 1.x.

    Wenn du z.B. bei einer 100x100 surface SetClipRect mit 99,99,100,100 aufrufst wird das intern in 99,99,1,1 umgewandelt, also auf die tatsächliche Größe zurechtgestutzt. Du hast dann zwar ein ClipRect gesetzt, aber nicht mehr unbedingt das, was du wolltest. Deswegen würd ich da ein SDL_TRUE erwarten, aber du müsst ich mir selbst nochmal die doku anschaun. (Nachgeschaut: Die Doku sagt dass es nur dann FALSE zurückgibt wenn dein x/y wert außerhalb der surface ist, dann wird clipping disabled)

    Die clipping area der quelle zu setzen ist iirc richtig.

    Mit SDL_SaveBMP(SDL_Surface* surface, const char* filename) solltest du einfach eine surface als BMP in einen dateinamen schreiben können, das geht soweit ich sehe in SDL 2.0 auch.

    Probier mal folgendes:

    //Funktion DrawIMG
      SDL_SetClipRect(pSurfWnd, 0); //disable clipping, alternativ auch ein Rect erstellen das garantiert die gesamte größe der surface darstellt
      SDL_Rect dst; //Ziel rect
      dst.x = dst.y = 1; //ganz am Anfang hinblitten.
      SDL_SetAlpha(pSurfUpd,0,128); //disable alpha blending (vielleicht ist das ein Problem?)
      iflag = SDL_BlitSurface(pSurfUpd, NULL, pSurfWnd, &dst);
      SDL_SaveBMP(pSurfUpd, "test1.bmp"); //surface als datei speichern, um zu schaun was drinnen steht
      SDL_SaveBMP(pSurfWnd, "test2.bmp"); //surface als datei speichern, um zu schaun was drinnen steht
      #ifdef DEBUGMODE
      #ifdef DEBUG_CIMAGE
      if(iflag == 0)
    

    Ändere vielleicht noch etwas code damit es nur einmal aufgerufen wird, und schau dir die Dateien an, bzw ob du jetzt etwas auf deinems screen siehst. Ist schon etwas länger her das ich mit SDL gearbeitet habe, vllt habe ich einen kleinen Fehler gemacht, aber die idee sollte klar sein.

    Mir ist übrigens auch aufgefallen, das alpha blending ein Problem machen könnte, also mit SetAlpha das mal ausmachen.



  • Hey,

    Ich habe meinen DEBUG Code mal erweitert. Die folgende Ausgabe zeigt alle Funktionen und die daneben stehenden Rückgabewerte, die ich zum Zeichnen des PNG benutze und zeigt auch die jeweiligen Surfaces (den jeweils interessanten Teil):

    http://s14.directupload.net/images/131225/bgcftciw.png

    Das Bild hat eine Größe von 420 * 77 px
    Daher glaube ich an sich, dass alles korrekt ist.
    Interessant ist aber:

    Ich entwickle unter Windows 7. Wenn ich unten in der Taskbar über meine Anwendung rüberzoome ist das Bild in der Vorschau tatsächlich auch zu sehen. Ich komme nur nicht mehr in die Anwendung direkt (durch raufklicken) rein, sowie ich einmal ALT-TAB verwendet habe (Ist ja im Vollbildmodus). Da zeichnet sich nichts neu.

    Beim aller ersten Mal Zeichnen zeichnet er aber alles andere nur nicht das Bild. Ich mache also definitiv beim Zeichnen irgendwas falsch. Ich zeichne folgende Sachen in genau der Reihenfolge:

    Hintergrund (schwarz)
    zufällig generierte Pixel
    das Bild

    Hintergrund und zufällig generierte Pixel klappt. Nur das Bild nicht.
    Draw Funktion sieht wie folgt aus.

    void CBuild::draw()
    {
      int iflag = 0;
    
      if(render)
      {
        if(state == menu)
        {
          pEffectRandomPixels->drawRandomPixels(pRenderer, 0xdc, 0xdc, 0xdc, 0xff);
          pIMG_logo->drawIMG(pRenderer, pSurfWnd);
          state = menu;
        }
    
        render = 0;
      }
    
      SDL_UpdateWindowSurface(pWindow);
    }
    

    "render" ist ein flag, was ich benutzen will, um zu verhindern, dass später ständig gezeichnet wird, auch wenn nichts passiert. Ob das Sinn macht weiß ich noch nicht. Aber ob render true oder false ist, ändert nichts am Problem.

    Gruß,
    PadMad



  • Kannst du mir evtl dein Projekt zur Verfügung stellen, damit ichs mir selbst anschaun kann? Bin schon neugierig was da los ist. Sonst fällt mir halt noch alpha an, die surfaces als BMP speichern zum feststellen WO das Problem ist, und evtl hast du vllt ein Problem mit einer endlosschleife bei pollevent...? Muss man evtl alles mal anschaun :>



  • Hey,

    Das wäre super, wenn da mal Jemand rüberschauen würde. Wäre dir sehr dankbar.

    http://www.wp1105995.server-he.de/kartoffel.zip

    Einfach entpacken. Sind die ganzen Files und die Projektdatei für vc++
    Schreib mir am besten über mein Profil ne Email. Ich glaube das geht iwie.

    EDIT: Das random'en von Pixeln ist leider auch noch verbuggt. Das liegt iwie an den Zufallszahlen. Kann also sein, dass du nen paar Mal starten musst, bis man was sieht 😃

    Gruß,
    PadMad



  • Mal abgesehen vom bug beim random pixel (hab ihn dann selbst auch gefunden 😉 ) funktioniert, es letztlich alles so, wie es soll - zumindest wird das Bild "test" bei mir angezeigt. Ich geh jetzt gleich schlafen, aber das sieht eher nach etwas aus, das eher nichts mit dem code zu tun hat. clean+rebuild versucht?



  • Hey,

    Danke für deine Mühe. Also clean und rebuild hat nichts gebracht. Aber wenns bei dir funktioniert und bei mir nicht... Dann weiß ich gerade echt nicht weiter...

    Die Frage ist, was hast du gemacht, was ich nicht gemacht habe 😕

    EDIT:

    habe gerade nochmal alle Bibliotheken und Abhängigkeiten geprüft.

    Konfigurationseigentschaften -> VC++ - Verzeichnisse

    C:\SDL2_image-2.0.0\include
    C:\SDL2-2.0.1\include

    Linker -> Eingabe:

    SDL2.lib
    SDL2main.lib
    SDL2_image.lib

    DLL - Dateien

    C:\SDL2-2.0.1\lib\x86\ -> SysWOW64
    C:\SDL2-2.0.1\lib\x64\ -> System32

    das gleiche auch mit den aus SDL2 Image.



  • Interessant:

    F:\dev\SDL2-2.0.1\include
    F:\dev\SDL2_image-2.0.0\include

    F:\dev\SDL2-2.0.1\lib\x86
    F:\dev\SDL2_image-2.0.0\lib\x86
    (hab nur die x86 libs verwendet, ich muss zugeben bin mir nicht sicher, aber x86 und x64 zu mischen kommt mir seltsam vor - kann sein dass du da falsche Funktionen gelinkt bekommst)

    Additional dependencies:
    SDL2.lib
    SDL2main.lib
    SDL2_image.lib

    Die .dlls hab ich direkt in den Programmordner kopiert - hab nur ne debug build getestet weil ich zu faul war das nochmal für release einzustellen :>

    Weiterer Unterschied: Ich hab vs2012 statt vs2013 verwendet



  • Hey,

    Ich mische sie nicht. Die 64 bit Dateien befinden sich nur vorsichtigshalber im System32 Ordner. Aber da es eine 32 Bit Anwendung ist, geht der nur an die DLLs im SysWOW64 Ordner. Und linken tue ich ja nur die x86 files. Du hast eigentlich dann auch nichts andereres gemacht, außer Visual Studio 2012 zu verwenden. Ich hoffe es liegt nicht daran, aber das werde ich später nochmal ausprobieren.



  • Ich habe jetzt unter VS 2013 nochmal die DLLs in den work ordner gepackt, aus den System32 und SysWOW64 auch komplett raus gehauen, gecleant, neu rebuildet und getestet. Hat immernoch nicht geklappt.

    Jetzt gerade möchte ich Visual Studio 2012 damit zum laufen kriegen, aber, er kennt die standardbibliotheken nicht? Weder time.h, noch iostream noch sonst was. Wie kommt das bitte?

    Das war ein leeres Projekt und es ist frisch neu installiert alles.



  • So...Nochmal komplett auf einem anderen Rechner alles wiederholt mit Visual Studio 2012 Express und es kommt genau die gleiche Macke.

    Es liegt entweder doch am Code oder du hast was grundsätzlich anders gemacht als ich.

    DLL Dateien (nur x86):

    Alle im Projektordner
    

    VC++-Verzeichnisse:

    Includeverzeichnisse:
    
    C:\SDL2-2.0.1\include
    C:\SDL2_image-2.0.0\include
    
    Bibliotheksverzeichnisse:
    
    C:\SDL2-2.0.1\lib\x86
    C:\SDL2_image-2.0.0\lib\x86
    

    Linker->Eingabe->Zusätzliche Abhängigkeiten

    SDL2.lib
    SDL2main.lib
    SDL2_image.lib
    

    Bis auf Visual Studio 2012 Express habe ich auch alles neu runtergeladen und alles neu eingebunden. Es muss doch am Code liegen irgendwie, oder am falsch einbinden. 😕 Das ist echt deprimierend an so was einfachem schon zu scheitern, weil ich auch einfach nicht weiß warum.


Anmelden zum Antworten