SDL: (char*)Bild anzeigen



  • Hallo zusammen,

    ich bekomme aus einer Funktion (nicht von SDL) ein char array (char* pImage)
    mit Bildinformationen zurück und möchte diese mit Hilfe von SDL anzeigen.

    Unter Qt kann ich das char-array zum Beispiel in ein QImage laden und dann nach Wunsch über ein QLabel darstellen.

    QImage ( const uchar * data, int width, int height, Format format);
    

    ➡ Wie könnte ich mein Bild nun über SDL anzeigen?

    Soweit ich das verstanden habe unterstützt SDL_image nur bestimmte
    Bildformate (png, bmp, gif, jpg,...)

    Ich habe zu dem Bild alle nötigen Informationen:
    Höhe, Breite, Bits pro Pixel, Farbinformationen für jeden Pixel (char*),...

    Da das Bild aber möglichst schnell aktualisiert werden soll möchte ich vermeiden, jeden Pixel einzeln "irgendwo" hinzukopieren.

    Hoffentlich hat jemand eine Idee.

    Grüße,
    Active02



  • Puh, SDL ist lange her... Aber schau dir mal SDL_RWFromMem() an, ich denke, das ist was du suchst.

    :hoppschwiiz: :hoppschwiiz: :hoppschwiiz:



  • 😃 danke schonmal für die Antwort.
    das könnte ich mal versuchen.

    folgende recht ähnliche Funktion habe ich gestern schon getestet
    aber es hat nicht so ganz Funktioniert:

    SDL_RWops *rw;
    rw = SDL_RWFromConstMem(pImage, sizeof(pImage));
    img = IMG_LoadBMP_RW(rw);
    

    egal ich teste mal...

    Edit:
    hmm sobald ich SDL_BlitSurface(..) aufrufe
    bekomme ich jeweils den Fehler:
    "SDL_UpperBlit: passed a null surface"

    SDL_Surface *img;
    char* pCopy = new char[nSize];  //nSize = Höhe * Breite * Bpp des Bildes
    memset(pCopy, 0, nSize);
    memcpy(pCopy, pImage, nSize);   //pImage = char* mit den Bilddaten (RGB)
    
    rw = SDL_RWFromConstMem(pCopy, sizeof(nSize));  
    
    img = IMG_LoadBMP_RW(rw);
    
    SDL_Rect rImg;
    rImg.h = nHeight; //Bildhöhe
    rImg.w = nWidth; //Bildbreite
    rImg.x = 0;
    rImg.y = 0;
    
    if (SDL_BlitSurface(img, &rImg, screen, &rImg) != 0)
    {
    		printf("Error: BlitSurface: %s\n", SDL_GetError());
    }
    

    bzw.:

    if (SDL_BlitSurface(img, 0, screen, 0) != 0)
    {
    		printf("Error: BlitSurface: %s\n", SDL_GetError());
    }
    

    Mich würde auch wundern wenn es funktionieren würde, denn mein Surface("img") weiß ja garnicht wie Hoch/Breit es ist, es hat praktisch nur die Bilddaten(RGB) intus.

    Edit2:
    Ich habe mir jetzt SFML angeschaut und kann das Bild zumindest mal mit

    sf::Image img; 
    img.SetPixel(x,y,col);
    

    anzeigen, muss halt mein Format noch ändern.
    Dann geht es vlt auch über den Konstruktor der als DataPointer einen sf::Uint8 möchte.

    trotzdem wäre es schön eine Lösung für SDL zu haben, also wenn jemand noch Ideen hat; nur her damit! 😉



  • Also ich zeige meine Bilder mit Hilfe der netten SDL-Bibliothek "SDL_image" an.

    #include "SDL.h"
    #include "SDL_image.h"
    
    [...]
    
    SDL_Surface *image=IMG_Load("meinpfad.png");
    if (!SDL_BlitSurface(image,NULL,screen,NULL))
       ; // Fehlermeldung
    
    [...]
    

    Das würde das angegebene Bild aus dem Verzeichnis in das Surface image laden und dies anschließend auf das Surface screen blitten.



  • Eventuell koennte SDL_MapRGB das richtige fuer dich sein. Damit kannst du ueber ein gegebenes Pixelformat RGB Farben in einen Uint32 Pixelwerte umrechnen. Um den Pixel dann auf den Screen zu malen kannst du dir einfach die SDL_Surface holen und direkt jeden einzelnen Pixel setzen. Dazu kannst du dir das Beispiel Pixel Access ansehen. 🙂



  • Wenn du Probleme mit dem Blitten von images hast dann schau mal in dieses Tutorial rein http://lazyfoo.net/SDL_tutorials/lesson03/index.php. Es ist zwar für C++ funktioniert aber in der Regeln auch genauso gut in anderen Hochsprachen.
    Weiterhin kannst du, wenn du ein Image blitten möchtest eine transparente Frabe angeben, das geht am aller besten mit SDL_SetColorKey, wobei auch SDL_MapRGB zu Einsatz kommen kann, um die transparente Farbe dezimal angeben zu können, da diese ansonsten in Hex erwartet wird. Also:

    SDL_Surface *img = IMG_Load("myImage.png");
    SDL_SetColorKey(img, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 255, 255, 255));


Anmelden zum Antworten