Как загрузить изображение в кодировке base64 как текстуру SDL в c ++? - PullRequest
0 голосов
/ 02 февраля 2019

Я получаю изображение в кодировке base64 из cpprestsdk и пытаюсь показать его в окне sdl.

Я не могу создать поверхность из строки base64, но она хорошо работает из файла на диске.

Я пробовал несколько преобразований строки в массивы и векторы символов, но SDL_Surface всегда равен нулю в конце.

Эти две записи направляли меняв направлении SDL_RWops:

SDL_Surface* base64ToSurface(std::string *image)
{
    SDL_RWops *rw = SDL_RWFromConstMem(image, sizeof(image));
    SDL_Surface *img = SDL_LoadBMP_RW(rw, 1);        
    if (img == nullptr)
    {
        logSDLError(std::cout, "base64ToSurface");
    }
    return img;
}

void convertBase64ToTexture()
{
    //base64 image string trimmed for a better readability
    std::string aImage = "R0lGODlhPQB...";

    SDL_Window *aWindow = SDL_CreateWindow("Lesson 2", 100, 100, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    SDL_Renderer *aRenderer = SDL_CreateRenderer(aWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    SDL_Surface *aSurface = base64ToSurface(&aImage);
    SDL_Texture *texture = nullptr;
    texture = SDL_CreateTextureFromSurface(aRenderer, aSurface);
    //Make sure converting went ok too
    if (texture == nullptr) 
    {
        logSDLError(std::cout, "CreateTextureFromSurface");
    }
}

1 Ответ

0 голосов
/ 08 февраля 2019

Спасибо за вашу помощь keltar, которая помогла мне немедленно.Если вы добавите свой комментарий в качестве ответа, я буду голосовать за него.

Следуя коду, который загружает файл base64 jpg в окно SDL.

void LoadImageJpeg(std::wstring theImage, int x, int y)
{
    //Clear the window
    //SDL_RenderClear(renderer);
    std::vector<unsigned char> img_vec = base64_decode(theImage);
    SDL_RWops *rw = SDL_RWFromConstMem(&img_vec[0], img_vec.size());
    SDL_Surface *aSurface = IMG_LoadTyped_RW(rw, 1, "JPG");
    if (aSurface == nullptr) {
        logSDLError(std::cout, "base64ToSurface");
    }
    SDL_Texture *texture = nullptr;
    texture = SDL_CreateTextureFromSurface(renderer, aSurface);
    //Make sure converting went ok too
    if (texture == nullptr) {
        logSDLError(std::cout, "CreateTextureFromSurface");
    }
    renderTexture(texture, renderer, 0, 0);
    SDL_RenderPresent(renderer);
    //SDL_Delay(500);
}

Спасибо.

...